Как заполнить и сохранить реквизит табличной части из справочника в 1С 7.7?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При доработке документов на платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда данные из справочника (например, артикул, ставка НДС или единица измерения) отображаются на форме, но не сохраняются в табличной части документа при проведении или закрытии. Разберем по шагам, почему свойство колонки «Формула» ведет себя по-разному и как корректно организовать автозаполнение реквизитов строк.

Особенности работы поля «Формула» в табличной части 1С 7.7

Проанализируем поведение элементов формы в версии 7.7. Поле Формула в свойствах колонки многострочной части имеет двоякое назначение в зависимости от наличия связи с реквизитом документа:

  1. Колонка без реквизита (вычисляемое поле): если в свойствах колонки не указан реквизит табличной части, выражение в поле «Формула» (например, Товар.Артикул) вычисляется системой динамически «на лету» только для отображения текста. В базу данных такое значение не записывается.
  2. Колонка с реквизитом документа: если колонка жестко привязана к реквизиту табличной части, поле «Формула» воспринимается платформой как имя функции или процедуры, которую необходимо вызвать при изменении значения пользователем. Написание прямого пути к данным через точку в этом поле не приведет к заполнению реквизита. Поле «Формула» у привязанной колонки следует очистить.

Способ 1. Заполнение при интерактивном выборе номенклатуры

Рассмотрим основной и наиболее правильный способ заполнения зависимых реквизитов строки при интерактивной работе пользователя. Значение должно подставляться в момент выбора товара в строке.

  1. В свойствах колонки Товар на форме документа в поле Формула укажем имя процедуры модуля формы, например: ПриВыбореТовара().
  2. В модуле формы документа опишем обработчик:

Процедура ПриВыбореТовара()
    // Заполняем реквизит текущей строки из реквизита выбранной номенклатуры
    Артикул = Товар.Артикул;
КонецПроцедуры

Такой подход обеспечивает минимальную нагрузку на систему: артикул перезаписывается только тогда, когда пользователь меняет значение в колонке «Товар», и не дергается при редактировании количества или цены.

Способ 2. Использование события окончания редактирования строки

Посмотрим на альтернативный вариант через предопределенную процедуру формы ПриОкончанииРедактированияСтроки. Она вызывается системой при выходе из режима редактирования строки таблицы.


Процедура ПриОкончанииРедактированияСтроки(НовСтр)
    // Проверяем заполненность номенклатуры
    Если ПустоеЗначение(Товар) = 0 Тогда
        Артикул = Товар.Артикул;
    КонецЕсли;
КонецПроцедуры

Параметр НовСтр принимает значение 1 при создании новой строки и 0 при изменении уже существующей. Данный обработчик срабатывает при любом завершении редактирования строки документа.

Способ 3. Заполнение при подборе и вводе на основании

Если в документе реализован механизм подбора номенклатуры или ввод на основании других документов, прямой интерактивный выбор в таблице не срабатывает. Разберем, где необходимо продублировать заполнение:

  1. Процедура ОбработкаПодбора: при добавлении строк через окно подбора необходимо явно присваивать значение новому реквизиту перед или после записи строки:
    
    Процедура ОбработкаПодбора(ЗначениеПодбора, КонтекстФормы)
        НоваяСтрока();
        Товар = ЗначениеПодбора;
        Артикул = Товар.Артикул;
        Количество = 1;
    КонецПроцедуры
    
  2. Процедура ВводНаОсновании: при переносе строк из документа-основания перенос артикула настраивается в цикле обхода строк документа-источника.

Обновление реквизита в существующих документах

Выясним причину, почему не следует выполнять заполнение реквизитов внутри процедуры ПриОткрытии() документа. Если поместить цикл по строкам в ПриОткрытии(), любой документ при обычном просмотре будет становиться модифицированным (появится признак изменений), а у пользователей с ограниченными правами могут возникнуть ошибки блокировки проведения.

Для разового заполнения реквизита в ранее созданных и проведенных документах создадим внешнюю обработку со следующим алгоритмом:


Док = СоздатьОбъект("Документ.ПоступлениеТоваров");
Док.ВыбратьДокументы(ДатаНачала, ДатаКонца);
Пока Док.ПолучитьДокумент() = 1 Цикл
    Модифицирован = 0;
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл
        Если ПустоеЗначение(Док.Артикул) = 1 Тогда
            Док.Артикул = Док.Товар.Артикул;
            Модифицирован = 1;
        КонецЕсли;
    КонецЦикла;
    
    Если Модифицирован = 1 Тогда
        // Записываем документ без обязательного перепроведения
        Док.Записать();
    КонецЕсли;
КонецЦикла;

Нужно ли дублировать артикул в табличную часть?

Перед добавлением реквизита в метаданные важно проанализировать архитектурную необходимость:

  1. Если артикул нужен только для печатных форм или отчетов: дублировать данные в табличную часть не требуется. В печатных формах и запросах платформы 1С 7.7 можно напрямую обращаться к реквизиту справочника через точку: ПечАртикул = Таблица.Товар.Артикул;.
  2. Если требуется зафиксировать историческое значение: создание отдельного реквизита табличной части оправдано, когда артикул у номенклатуры в справочнике может со временем измениться, но в уже проведенных первичных документах должно сохраниться значение на момент поступления.
← На главную