При доработке документов на платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда данные из справочника (например, артикул, ставка НДС или единица измерения) отображаются на форме, но не сохраняются в табличной части документа при проведении или закрытии. Разберем по шагам, почему свойство колонки «Формула» ведет себя по-разному и как корректно организовать автозаполнение реквизитов строк.
Проанализируем поведение элементов формы в версии 7.7. Поле Формула в свойствах колонки многострочной части имеет двоякое назначение в зависимости от наличия связи с реквизитом документа:
Товар.Артикул) вычисляется системой динамически «на лету» только для отображения текста. В базу данных такое значение не записывается.Рассмотрим основной и наиболее правильный способ заполнения зависимых реквизитов строки при интерактивной работе пользователя. Значение должно подставляться в момент выбора товара в строке.
ПриВыбореТовара().
Процедура ПриВыбореТовара()
// Заполняем реквизит текущей строки из реквизита выбранной номенклатуры
Артикул = Товар.Артикул;
КонецПроцедуры
Такой подход обеспечивает минимальную нагрузку на систему: артикул перезаписывается только тогда, когда пользователь меняет значение в колонке «Товар», и не дергается при редактировании количества или цены.
Посмотрим на альтернативный вариант через предопределенную процедуру формы ПриОкончанииРедактированияСтроки. Она вызывается системой при выходе из режима редактирования строки таблицы.
Процедура ПриОкончанииРедактированияСтроки(НовСтр)
// Проверяем заполненность номенклатуры
Если ПустоеЗначение(Товар) = 0 Тогда
Артикул = Товар.Артикул;
КонецЕсли;
КонецПроцедуры
Параметр НовСтр принимает значение 1 при создании новой строки и 0 при изменении уже существующей. Данный обработчик срабатывает при любом завершении редактирования строки документа.
Если в документе реализован механизм подбора номенклатуры или ввод на основании других документов, прямой интерактивный выбор в таблице не срабатывает. Разберем, где необходимо продублировать заполнение:
ОбработкаПодбора: при добавлении строк через окно подбора необходимо явно присваивать значение новому реквизиту перед или после записи строки:
Процедура ОбработкаПодбора(ЗначениеПодбора, КонтекстФормы)
НоваяСтрока();
Товар = ЗначениеПодбора;
Артикул = Товар.Артикул;
Количество = 1;
КонецПроцедуры
ВводНаОсновании: при переносе строк из документа-основания перенос артикула настраивается в цикле обхода строк документа-источника.Выясним причину, почему не следует выполнять заполнение реквизитов внутри процедуры ПриОткрытии() документа. Если поместить цикл по строкам в ПриОткрытии(), любой документ при обычном просмотре будет становиться модифицированным (появится признак изменений), а у пользователей с ограниченными правами могут возникнуть ошибки блокировки проведения.
Для разового заполнения реквизита в ранее созданных и проведенных документах создадим внешнюю обработку со следующим алгоритмом:
Док = СоздатьОбъект("Документ.ПоступлениеТоваров");
Док.ВыбратьДокументы(ДатаНачала, ДатаКонца);
Пока Док.ПолучитьДокумент() = 1 Цикл
Модифицирован = 0;
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
Если ПустоеЗначение(Док.Артикул) = 1 Тогда
Док.Артикул = Док.Товар.Артикул;
Модифицирован = 1;
КонецЕсли;
КонецЦикла;
Если Модифицирован = 1 Тогда
// Записываем документ без обязательного перепроведения
Док.Записать();
КонецЕсли;
КонецЦикла;
Перед добавлением реквизита в метаданные важно проанализировать архитектурную необходимость:
ПечАртикул = Таблица.Товар.Артикул;.