При разработке в среде 1С:Предприятие 8.3, особенно в таких сложных конфигурациях, как ERP Управление предприятием или Комплексная автоматизация, программисты часто сталкиваются с ситуацией: новый реквизит табличной части (ТЧ), добавленный через расширение, корректно отображается на форме, позволяет вводить данные, но после записи документа значения бесследно исчезают. Давайте подробно разберем, почему это происходит, как диагностировать проблему и какие существуют риски при использовании расширений для хранения данных.
Когда мы добавляем реквизит в расширение, платформа 1С не меняет структуру основной таблицы документа в базе данных SQL. Вместо этого создается отдельная вспомогательная таблица. При чтении объекта система выполняет соединение (LEFT JOIN) основной таблицы и таблицы расширения. Если данные «не доходят» до базы, значит, на одном из этапов цепочки «Форма — Объект — База данных» происходит разрыв. Выясним основные причины этого разрыва.
Первым делом проанализируем, как реквизит добавлен на форму документа. Часто ошибка кроется в том, что элемент формы связан не с данными объекта, а с временными данными формы. Разберем по шагам, как это проверить:
Важно: значение должно выглядеть как Объект.ИмяТабличнойЧасти.ИмяРеквизита (например, Объект.РаспределениеПоСчетам.Сумма2). Если в пути к данным отсутствует префикс Объект, то данные будут существовать только в рамках текущего сеанса работы формы и не будут переданы в модуль объекта для записи в базу.
Для того чтобы механизм записи отработал штатно, в расширение должна быть заимствована вся иерархия объектов. Проверим, все ли элементы присутствуют в нашем расширении:
Если нарушена логика заимствования, платформа может воспринимать реквизит как «эфемерный», не имеющий физического представления в СУБД.
Чтобы понять, сохраняются ли данные на самом деле, проанализируем ситуацию с помощью Консоли запросов. Это позволит исключить ошибки отображения на форме. Выполним следующие действия:
ВЫБРАТЬ
ТЧ.Сумма2,
ТЧ.Ссылка
ИЗ
Документ.ЗаявкаНаРасходованиеДенежныхСредств.РаспределениеПоСчетам КАК ТЧ
ГДЕ
ТЧ.Ссылка = &НужнаяСсылка
В конфигурациях уровня ERP многие документы имеют сложную логику пересчета. Рассмотрим ситуацию, когда типовой код может очищать ваши данные. В модуле объекта или менеджера могут существовать процедуры ПередЗаписью или ПриЗаписи, которые программно перезаполняют табличную часть. Если ваша колонка Сумма2 не участвует в алгоритмах типового заполнения, она может просто игнорироваться или затираться при обновлении строк ТЧ.
Для решения этой проблемы попробуем использовать расширение модуля объекта:
&После("ПередЗаписью")
Процедура пр_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверим, что данные в ТЧ присутствуют перед финальной отправкой в БД
Для Каждого СтрокаТЧ Из ЭтотОбъект.РаспределениеПоСчетам Цикл
// Здесь можно принудительно проверить или дозаполнить значение
КонецЦикла;
КонецПроцедуры
Рассмотрим важный аспект, который упоминали участники обсуждения: безопасность данных. Работа с расширениями в 1С имеет существенное отличие от работы с основной конфигурацией:
Практический совет: Если данные критически важны для учета, рассмотрите вариант внесения изменений в основную конфигурацию. В современных версиях 1С можно включить возможность изменения, оставив конфигурацию на поддержке. Это позволит добавлять свои реквизиты, не мешая штатному обновлению через сравнение-объединение, и гарантирует сохранность данных при манипуляциях с программным кодом.
Иногда платформа кэширует состояние объекта. Попробуем после программного заполнения реквизита на клиенте вызвать метод ОповеститьОбИзменении(Объект.Ссылка);. Это заставит открытые формы и списки перечитать данные из базы. Однако помните, что это лишь визуальное обновление, оно не заменяет физическую запись объекта методом Записать().
Если реквизит ТЧ не сохраняется, последовательно проверьте:
Объект.ИмяТЧ.ИмяРеквизита.ПередЗаписью модуля объекта.Соблюдение этих шагов поможет вам быстро найти «слабое звено» в механизме расширения и обеспечить надежное сохранение данных в 1С:ERP.