Почему не отображаются строки при программном заполнении документа Установка цен номенклатуры?

Программист 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Особенности структуры документа Установка цен номенклатуры

Главная причина проблемы заключается в том, что документ Установка цен номенклатуры имеет сложную внутреннюю архитектуру. В отличие от простых документов, здесь визуальное отображение данных на форме сильно зависит от взаимодействия двух табличных частей:

  1. ТипыЦен — содержит перечень категорий цен (например, Оптовая, Розничная, Закупочная), которые устанавливаются текущим документом.
  2. Товары — содержит собственно номенклатуру, цены и служебные реквизиты для связи.

Проанализируем ситуацию: на форме документа цены отображаются в виде динамической таблицы, где колонки формируются на основании строк из табличной части ТипыЦен. Если связь между строкой товара и типом цены нарушена, платформа не понимает, в какую колонку вывести значение, и скрывает строку.

Ключевой реквизит ИндексСтрокиТаблицыЦен

Для связи строк в ТЧ Товары с конкретным типом цены используется реквизит ИндексСтрокиТаблицыЦен. Это числовое поле, которое должно строго соответствовать индексу строки в табличной части ТипыЦен (индексация начинается с нуля).

Разберем по шагам логику правильного заполнения:

Выясним причину ошибки в коде автора темы. В сообщении №19 автор совершает типичную ошибку: он использует инкрементальный счетчик Ном, который увеличивается с каждой новой номенклатурой. В итоге первая строка получает индекс 1, вторая — 2 и так далее. Поскольку в ТЧ ТипыЦен строк с такими индексами не существует, система очищает данные при записи или открытии.

Правильное заполнение единиц измерения и номенклатуры

Еще один важный нюанс связан с реквизитом ЕдиницаИзмерения. В 1С:УТ 10.3 этот реквизит имеет тип СправочникСсылка.ЕдиницыИзмерения. Важно помнить, что владельцем этой ссылки обязательно должна быть та номенклатура, которая указана в текущей строке. Посмотрим на пример кода, исправляющий эту логику:


НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;
// Устанавливаем единицу хранения, принадлежащую именно этой номенклатуре
НоваяСтрока.ЕдиницаИзмерения = СсылкаНаНоменклатуру.ЕдиницаХраненияОстатков;
НоваяСтрока.Цена = НужнаяЦена;
НоваяСтрока.Валюта = Справочники.Валюты.НайтиПоКоду("643");
НоваяСтрока.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Цена Д");
// Указываем индекс строки из ТЧ ТипыЦен (если тип цены один - это 0)
НоваяСтрока.ИндексСтрокиТаблицыЦен = 0;

Работа через COM-соединение

Если вы выполняете заполнение из внешней базы через COMConnector (как в сообщении №18), будьте предельно внимательны при присвоении ссылочных значений. Объекты, полученные через ComConnection, являются «чужими» для текущей базы. Чтобы избежать появления пустых строк («Объект не найден»), необходимо всегда выполнять поиск объекта в локальной базе по коду или уникальному идентификатору (GUID).

Рассмотрим пример правильного сопоставления объектов:


// Получаем код номенклатуры из COM-соединения
КодНоменклатуры = СомОбъектНоменклатура.Код;
// Ищем эту номенклатуру в ТЕКУЩЕЙ базе
ЛокальнаяНоменклатура = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);

Если Не ЛокальнаяНоменклатура.Пустая() Тогда
    НоваяСтрока = ДокументОбъект.Товары.Добавить();
    НоваяСтрока.Номенклатура = ЛокальнаяНоменклатура;
    // Аналогично ищем ТипЦен в локальной базе
    НоваяСтрока.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000001");
    НоваяСтрока.ИндексСтрокиТаблицыЦен = 0;
КонецЕсли;

Обновление формы документа

Если код выполняется непосредственно в модуле формы документа (например, по нажатию кнопки «Загрузить»), одного заполнения табличной части Товары недостаточно. В конфигурациях на обычных формах данные ТЧ часто кэшируются или преобразуются для отображения в специальных элементах управления.

Проанализируем ситуацию: после программного изменения Товары нужно принудительно запустить механизмы перестроения формы. В типовой УТ 10.3 для этого следует вызвать экспортную процедуру модуля формы (если она предусмотрена разработчиком) или использовать стандартный метод:


// Если заполнение идет в модуле формы
ЭтаФорма.Обновить(); 
// Или специфические вызовы типовой конфигурации
ЗаполнитьТабличноеПолеТовары(); 

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

  1. Сначала программно заполните табличную часть ТипыЦен.
  2. При добавлении строк в Товары обязательно заполняйте ИндексСтрокиТаблицыЦен, ориентируясь на порядковый номер типа цены в первой ТЧ.
  3. Следите за тем, чтобы ЕдиницаИзмерения принадлежала выбранной номенклатуре.
  4. При использовании внешних источников (Excel, COM) всегда выполняйте поиск ссылок в текущей базе данных.
  5. Если документ не записывается сразу, а лишь заполняется на форме, вызывайте методы обновления визуальных данных формы.

Следуя этим правилам, вы избавитесь от проблемы «исчезающих» строк и обеспечите корректную работу документа Установка цен номенклатуры.

← На главную