В процессе разработки конфигураций на платформе «1С:Предприятие 8» начинающие специалисты часто сталкиваются с двумя неприятными ситуациями: когда в созданной печатной форме вместо данных отображаются пустые строки (или только их порядковые номера), и когда после нажатия кнопок «Записать» или «Провести» вся введенная в таблицу информация бесследно исчезает. Эти проблемы кажутся магическими, но на самом деле они имеют четкое техническое обоснование, связанное с архитектурой платформы и механизмом связи интерфейса с базой данных.
В этой статье мы подробно разберем, почему так происходит, проанализируем внутренние механизмы работы формы и макета, а также составим пошаговый план решения этих задач. Давайте вместе разберемся в тонкостях объектной модели 1С.
Представим ситуацию: вы заполнили документ, в табличной части есть номенклатура, количество и цена. Вы нажимаете кнопку «Печать», открывается табличный документ, но в нем заполнена только колонка «№», а остальные поля пусты. Почему так происходит? Рассмотрим основные причины.
1. Несоответствие имен параметров в макете и коде
Проанализируем работу макета. В табличном документе (макете) для каждой ячейки, куда должны выводиться данные, в свойстве «Заполнение» должно быть выбрано значение Параметр. Если вы назвали параметр в макете Товар, а в коде при заполнении обращаетесь к полю Номенклатура, платформа не выдаст ошибку. Она просто не найдет совпадения и оставит ячейку пустой.
2. Ошибка в использовании метода заполнения параметров
Обычно вывод строк в печатную форму происходит в цикле. Разберем типичный пример кода, который может приводить к ошибке, если он написан небрежно:
Для Каждого ТекущаяСтрока Из СсылкаНаОбъект.Товары Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Если забыть заполнить параметры, область выведется пустой
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Чтобы данные появились, мы должны явно передать их в параметры области. Проанализируем правильный подход:
Для Каждого ТекущаяСтрока Из СсылкаНаОбъект.Товары Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Метод Заполнить() ищет совпадения имен свойств строки и параметров макета
ОбластьСтрока.Параметры.Заполнить(ТекущаяСтрока);
// Также можно заполнять параметры вручную для надежности
ОбластьСтрока.Параметры.НоменклатураНаименование = ТекущаяСтрока.Номенклатура.Наименование;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
3. Свойство «Заполнение»: Текст вместо Параметра
Посмотрим на свойства ячейки в конфигураторе. Если в поле «Заполнение» стоит Текст, то что бы вы ни писали в коде в коллекцию Параметры, в печати всегда будет отображаться статичное значение из ячейки. Проверьте, чтобы для всех динамических данных стояло значение Параметр.
Это более серьезная архитектурная ошибка. Она связана с пониманием того, как данные живут на форме и как они попадают в базу данных. В 1С существует разделение на «Данные объекта» и «Данные формы». Для корректного программного связывания колонок формы с базой данных можно изучить пример программного создания колонок в табличной части с сохранением значений.
1. Неверный путь к данным (Data Path)
Выясним, как данные из таблицы на экране попадают в базу. У каждого элемента управления на форме (например, у таблицы) есть свойство ПутьКДанным.
Если вы создали реквизит непосредственно в дереве реквизитов формы (справа в редакторе формы), а не в дереве метаданных объекта (слева в окне конфигурации), то эти данные являются временными. Они существуют только пока открыто окно.
Проанализируем правильную структуру реквизитов формы:
Объект (выделен жирным).МояТаблица, а не Объект.Товары, то при нажатии кнопки «Провести» платформа сохраняет данные Объекта, в котором табличная часть пуста, а ваши введенные данные из МояТаблица просто игнорируются и очищаются при обновлении формы.2. Отсутствие реквизитов в конфигурации
Как было отмечено в обсуждении, важно проверить окно «Конфигурация» (слева). Если вы добавили колонки только в «Реквизиты формы», они не имеют физического места в базе данных. Для решения проблемы убедитесь, что:
Товары).Номенклатура, Количество).Объект.Товары.3. Программная очистка в обработчиках
Иногда разработчики используют обработчики событий ПередЗаписью или ПриЗаписи. Разберем ситуацию: вы могли написать код, который очищает таблицу для какой-то проверки, но забыли наполнить её обратно или возвращаете Отказ = Истина не вовремя. Посмотрите, нет ли в модуле объекта команд типа Товары.Очистить(), которые срабатывают без условий.
Рассмотрим последовательность действий, которая поможет гарантированно решить обе проблемы.
Шаг 1. Проверка структуры метаданных
Откройте дерево конфигурации, найдите ваш документ. Убедитесь, что в ветке «Табличные части» создана ваша таблица, а внутри неё — все необходимые колонки с правильными типами данных (СправочникСсылка, Число и т.д.).
Шаг 2. Проверка привязки на форме
Откройте форму документа. Перейдите на закладку «Реквизиты» (справа). Разверните жирный реквизит Объект. Найдите там вашу табличную часть. Теперь посмотрите на элементы формы (слева). Выделите таблицу и в свойствах проверьте поле ПутьКДанным. Там должно быть написано Объект.ИмяВашейТаблицы.
Шаг 3. Настройка макета печатной формы
Откройте макет. Для каждой ячейки строки:
Параметр.Цена).Область.Параметры.Заполнить(СтрокаДанных).Подводя итог, можно сказать, что «исчезновение» данных — это почти всегда следствие работы с реквизитами формы вместо реквизитов объекта. Платформа 1С строго разграничивает то, что отображается в интерфейсе, и то, что записывается в базу данных. Понимая принцип ПутьКДанным и правила заполнения Параметров макета, вы сможете легко избегать подобных ошибок в будущем. Для быстрой реализации работы с макетом и параметрами пригодится готовый пример внешней печатной формы на БСП.