При разработке механизмов автоматической загрузки цен в конфигурациях на обычных формах (например, УТ 10.3 или КА 1.1) программисты часто сталкиваются с «мистической» ситуацией: в режиме отладки табличная часть документа Товары заполнена данными, но при открытии формы документа в интерфейсе «1С:Предприятие» таблица остается пустой. Более того, при попытке записать такой документ строки могут бесследно удалиться. Рассмотрим подробнее, почему это происходит и как правильно организовать программное заполнение этого непростого документа.
Главная причина проблемы заключается в том, что документ Установка цен номенклатуры имеет сложную внутреннюю архитектуру. В отличие от простых документов, здесь визуальное отображение данных на форме сильно зависит от взаимодействия двух табличных частей:
Проанализируем ситуацию: на форме документа цены отображаются в виде динамической таблицы, где колонки формируются на основании строк из табличной части ТипыЦен. Если связь между строкой товара и типом цены нарушена, платформа не понимает, в какую колонку вывести значение, и скрывает строку.
Для связи строк в ТЧ Товары с конкретным типом цены используется реквизит ИндексСтрокиТаблицыЦен. Это числовое поле, которое должно строго соответствовать индексу строки в табличной части ТипыЦен (индексация начинается с нуля).
Разберем по шагам логику правильного заполнения:
ТипыЦен будет всего одна строка (индекс 0). Следовательно, во всех строках ТЧ Товары реквизит ИндексСтрокиТаблицыЦен должен быть равен 0.Товары должно быть создано две строки: одна с индексом 0, вторая — с индексом 1.Выясним причину ошибки в коде автора темы. В сообщении №19 автор совершает типичную ошибку: он использует инкрементальный счетчик Ном, который увеличивается с каждой новой номенклатурой. В итоге первая строка получает индекс 1, вторая — 2 и так далее. Поскольку в ТЧ ТипыЦен строк с такими индексами не существует, система очищает данные при записи или открытии.
Еще один важный нюанс связан с реквизитом ЕдиницаИзмерения. В 1С:УТ 10.3 этот реквизит имеет тип СправочникСсылка.ЕдиницыИзмерения. Важно помнить, что владельцем этой ссылки обязательно должна быть та номенклатура, которая указана в текущей строке. Посмотрим на пример кода, исправляющий эту логику:
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;
// Устанавливаем единицу хранения, принадлежащую именно этой номенклатуре
НоваяСтрока.ЕдиницаИзмерения = СсылкаНаНоменклатуру.ЕдиницаХраненияОстатков;
НоваяСтрока.Цена = НужнаяЦена;
НоваяСтрока.Валюта = Справочники.Валюты.НайтиПоКоду("643");
НоваяСтрока.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Цена Д");
// Указываем индекс строки из ТЧ ТипыЦен (если тип цены один - это 0)
НоваяСтрока.ИндексСтрокиТаблицыЦен = 0;
Если вы выполняете заполнение из внешней базы через COMConnector (как в сообщении №18), будьте предельно внимательны при присвоении ссылочных значений. Объекты, полученные через ComConnection, являются «чужими» для текущей базы. Чтобы избежать появления пустых строк («Объект не найден»), необходимо всегда выполнять поиск объекта в локальной базе по коду или уникальному идентификатору (GUID).
Рассмотрим пример правильного сопоставления объектов:
// Получаем код номенклатуры из COM-соединения
КодНоменклатуры = СомОбъектНоменклатура.Код;
// Ищем эту номенклатуру в ТЕКУЩЕЙ базе
ЛокальнаяНоменклатура = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);
Если Не ЛокальнаяНоменклатура.Пустая() Тогда
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = ЛокальнаяНоменклатура;
// Аналогично ищем ТипЦен в локальной базе
НоваяСтрока.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000001");
НоваяСтрока.ИндексСтрокиТаблицыЦен = 0;
КонецЕсли;
Если код выполняется непосредственно в модуле формы документа (например, по нажатию кнопки «Загрузить»), одного заполнения табличной части Товары недостаточно. В конфигурациях на обычных формах данные ТЧ часто кэшируются или преобразуются для отображения в специальных элементах управления.
Проанализируем ситуацию: после программного изменения Товары нужно принудительно запустить механизмы перестроения формы. В типовой УТ 10.3 для этого следует вызвать экспортную процедуру модуля формы (если она предусмотрена разработчиком) или использовать стандартный метод:
// Если заполнение идет в модуле формы
ЭтаФорма.Обновить();
// Или специфические вызовы типовой конфигурации
ЗаполнитьТабличноеПолеТовары();
Резюмируем основные правила для успешного создания документа:
ИндексСтрокиТаблицыЦен, ориентируясь на порядковый номер типа цены в первой ТЧ.ЕдиницаИзмерения принадлежала выбранной номенклатуре.Следуя этим правилам, вы избавитесь от проблемы «исчезающих» строк и обеспечите корректную работу документа Установка цен номенклатуры.