Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 июл 2022, 12:35

Дата в справочнике

Автор Orion, 20 дек 2017, 06:17

0 Пользователей и 1 гость просматривают эту тему.

Orion

Как добавить в Справочник поле "Дата" по аналогии с таким же полем в Документах?
Если просто добавить реквизит и установить для него тип "Дата", то это не даст нужного результата - это будет обычное поле, которое будет пустым при открытии элемента Справочника. А нужно, чтобы при создании нового элемента Справочника в поле автоматически подставлялась текущая дата.

ls600

Процедура ПриОткрытии()
Если ЭтоНовый() Тогда
      РеквизитДата = ТекущаяДата(); //РеквизитДата - Твой новый реквизит в справочнике
КонецЕсли;
КонецПроцедуры

Golickoff

ls600, не ПриОткрытии(), а ПередЗаписью(Отказ).
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

ls600


Orion

Спасибо!
Только почему ПередЗаписью? В этом случае при открытии формы поле будет пустым.
А вот ПриОткрытии сработало... Или я чего-то не понял?

Golickoff

Цитата: Orion от 20 дек 2017, 21:36
А вот ПриОткрытии сработало... Или я чего-то не понял?
А теперь создайте программно, затем получите ссылку и проверьте дату.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

AIFrame

БТВ, мы когда-то тоже заморочились с фиксацией даты создания элемента справочника, а потом хотелки разрослись, нужно было знать когда и кто что изменил и т.д.
Поэтому сразу рекомендую не только поле даты добавить, но и ТЧ для фиксации изменений прямо в элементе справочника.
И в тот же ПередЗаписью добавить. Делюсь кодом. Он под обычные формы, но под управляемые там в принципе ничего не переделывается. Вся работа с модулем объекта.
// ========================= АДМ - РЕГИСТРАЦИЯ ИЗМЕНЕНИЙ =========================
Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя <> "" Тогда
Если ЭтоНовый() или НЕ мЭтоНеНовый Тогда
НадоЗафиксироватьИзменение = ИСТИНА;
ВсегоСтрок = ИсторияИзменений.Количество();
Если ВсегоСтрок > 0 Тогда
ПоследняяСтрока = ИсторияИзменений[ВсегоСтрок-1];
Если ПоследняяСтрока.СписокИзменений = "Создание объекта." Тогда
НадоЗафиксироватьИзменение = ЛОЖЬ;
ПоследняяСтрока.Дата = ТекущаяДата();
КонецЕсли;
КонецЕсли;
Если НадоЗафиксироватьИзменение Тогда
НоваяСтрока = ИсторияИзменений.Добавить();
НоваяСтрока.Дата = ТекущаяДата();
НоваяСтрока.Пользователь = ПараметрыСеанса.ТекущийПользователь;
НоваяСтрока.СписокИзменений = "Создание объекта.";
КонецЕсли;
Иначе
ТЧ = ОбщийМодуль_АДМ.ПолучитьТаблицуИзмененныхРеквизитов("Справочник.Номенклатура", ЭтоНовый(), ЭтотОбъект);
Если ТЧ.Количество() > 0 Тогда
НоваяСтрока = ИсторияИзменений.Добавить();
НоваяСтрока.Дата = ТекущаяДата();
НоваяСтрока.Пользователь = ПараметрыСеанса.ТекущийПользователь;
СкомпилированнаяСтрока = ОбщийМодуль_АДМ.ПолучитьСтрокуИзмененийОбъекта(ТЧ);
//Сообщить(СкомпилированнаяСтрока);
НоваяСтрока.СписокИзменений = СкомпилированнаяСтрока;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// ^^^^^^^^^^^^^^^^^^^^^^^^^ АДМ - РЕГИСТРАЦИЯ ИЗМЕНЕНИЙ ^^^^^^^^^^^^^^^^^^^^^^^^^

// ===================== РЕГИСТРАЦИЯ ИЗМЕНЕНИЙ НОМЕНКЛАТУРЫ И ЕДИНИЦ =====================

// Возвращает список измененных реквизитов объекта при записи
Функция ПолучитьТаблицуИзмененныхРеквизитов(ИмяСправочника, ЭтоНовый, ОбъектСпр) Экспорт
ТЧ = Новый ТаблицаЗначений;
ТЧ.Колонки.Добавить("Реквизит");
ТЧ.Колонки.Добавить("Было");
ТЧ.Колонки.Добавить("Стало");
    Если НЕ ЭтоНовый Тогда
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ *
            |ИЗ
            |    "+ИмяСправочника+" КАК _
            |ГДЕ
            |    _.Ссылка = &Ссылка";
        Запрос.УстановитьПараметр("Ссылка", ОбъектСпр.Ссылка);
        Результат = Запрос.Выполнить().Выбрать();
Если Результат.Количество() > 0 Тогда
Результат.Следующий();
СписокРеквизитов = ОбъектСпр.Метаданные().Реквизиты;
СписокСтандартныхРеквизитов = ОбъектСпр.Метаданные().СтандартныеРеквизиты;
Для Каждого текРеквизит из СписокРеквизитов Цикл
//Сообщить("" + Результат[текРеквизит.Имя] + " -> " + ОбъектСпр[текРеквизит.Имя]);
Если Результат[текРеквизит.Имя] <> ОбъектСпр[текРеквизит.Имя] Тогда
СтрокаТЧ = ТЧ.Добавить();
СтрокаТЧ.Реквизит = текРеквизит.Имя;
СтрокаТЧ.Было = Результат[текРеквизит.Имя];
СтрокаТЧ.Стало = ОбъектСпр[текРеквизит.Имя];
                КонецЕсли;
            КонецЦикла;
Для Каждого текСтандартныйРеквизит из СписокСтандартныхРеквизитов Цикл
Если Результат[текСтандартныйРеквизит.Имя] <> ОбъектСпр[текСтандартныйРеквизит.Имя] Тогда
СтрокаТЧ = ТЧ.Добавить();
СтрокаТЧ.Реквизит = текСтандартныйРеквизит.Имя;
СтрокаТЧ.Было = Результат[текСтандартныйРеквизит.Имя];
СтрокаТЧ.Стало = ОбъектСпр[текСтандартныйРеквизит.Имя];
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
КонецЕсли;
Возврат ТЧ;
КонецФункции


Функция ПолучитьСтрокуИзмененийОбъекта(ТЧ) Экспорт
СтрокаВозврата = "";
ИНД = 1;
Для Каждого СтрокаТЧ ИЗ ТЧ Цикл
СтрокаВозврата = "" + СтрокаВозврата + ?(ИНД > 1, Символы.ПС, "")
+ СтрокаТЧ.Реквизит + ": " + СтрокаТЧ.Было + " -> " + СтрокаТЧ.Стало;
ИНД = ИНД + 1;
КонецЦикла;
Возврат СтрокаВозврата;
КонецФункции

Orion

Цитата: Golickoff от 21 дек 2017, 02:46
Цитата: Orion от 20 дек 2017, 21:36
А вот ПриОткрытии сработало... Или я чего-то не понял?
А теперь создайте программно, затем получите ссылку и проверьте дату.

М-да... моих знаний действительно не хватает, я действительно начинающий...:(
Вчера добавил... как я описал, в событие ПриОткрытии. При открытии формы в поле фиксируется текущая дата. При закрытии формы дата сохраняется. Сегодня вошел в тот же элемент справочника, дата на месте - как ей и положено, вчерашняя (дата создания).
Если добавить код в событие ПередЗаписью, то при открытии формы в поле Дата пусто, а так ведь не должно быть...
Если можно, объясните, в чем тонкость, пожалуйста... Хочется все-таки понять до конца. Для меня это не очевидно, как для большинства присутствующих...

AIFrame

Цитата: Orion от 21 дек 2017, 06:07Если добавить код в событие ПередЗаписью, то при открытии формы в поле Дата пусто, а так ведь не должно быть
При открытии формы создания НОВОГО объекта. После записи дата там будет.
Суть в том, что вы создали реквизит, добавили его на форму и сняли с него доступность, чтобы не меняли.
При записи нового объекта этот реквизит будет заполнен. Когда второй раз откроете - дата там будет.
При этом, обработчик ПередЗаписью должен быть не событием формы, а событием объекта справочника, т.е. в модуле объекта, а не формы.

И тогда, если объект будет создаваться обработкой (а обработки при создании формы не открывают и мышкой не тыкают), у него в любом случае будет заполнена ваша дата.
Хотите чтобы была дата при создании нового объекта сразу - ну повесьте на форму ПриОткрытии как писали выше, но дата в любом случае должна заполняться ПередЗаписью в модуле. Просто представьте гипотетическую ситуацию - форму нового элемента открыли сегодня, забыли и записали новый через месяц. По факту, новый элемент был создан в день записи, а в дате у вас будет дата ПриОткрытии.

Golickoff

Фишка в том, что элемент справочника можно создать нажатием кнопки "Добавить" в форме списка справочника. В этот момент открывается форма и срабатывает её процедура ПриОткрытии. А можно создать элемент справочника путём написания кода типа НовыйЭлемент = Справочники.НашСправочник.СоздатьЭлемент();
НовыйЭлемент.Записать();
и в этом случае дата окажется пустой, потому что форма не открывалась. А если засунуть это в процедуру ПередЗаписью, то каждый раз перед записью нового элемента будет заполняться поле даты.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск