Разработка в расширениях — это удобный и гибкий механизм адаптации типовых конфигураций под нужды бизнеса. Однако программисты часто сталкиваются с ситуацией, когда новый реквизит документа или справочника, добавленный через расширение, успешно отображается на форме, позволяет вводить данные, но после нажатия кнопки «Записать» или «Провести» данные бесследно исчезают. Проанализируем причины этой проблемы и разберем по шагам методы её решения.
Первым делом проанализируем самое очевидное — связь элемента управления на форме с данными объекта. Даже если реквизит добавлен в объект (например, в документ) в самом расширении, он не начнет сохраняться автоматически, если на форме он добавлен некорректно. Рассмотрим, на что нужно обратить внимание:
ПутьКДанным. Оно должно иметь вид Объект.ИмяВашегоРеквизита.Если вы случайно создали реквизит самой формы (локальную переменную формы), а не реквизит объекта, то при закрытии формы или записи объекта данные не попадут в таблицу базы данных. Выясним, что в окне свойств реквизита в колонке «Тип» указан именно путь через Объект.
В системе 1С:Предприятие права доступа работают по принципу «Разрешено только то, что явно указано». Важно понимать, что права основной конфигурации ничего не знают о новых объектах или реквизитах, добавленных в расширение. Рассмотрим алгоритм исправления прав:
Проанализируем ситуацию: пользователь имеет полные права в основной конфигурации, но в расширении вы добавили реквизит СрокПоставки. При записи система проверяет права расширения. Если там нет роли, разрешающей «Изменение» и «Просмотр» этого реквизита, платформа просто проигнорирует запись данных в это поле, не выдавая при этом никакой ошибки.
Для решения этой задачи выполним следующие действия:
Разберем влияние настроек безопасности. По умолчанию многие расширения подключаются в «Безопасном режиме». В этом режиме платформа накладывает ряд ограничений на выполнение операций, которые могут повлиять на целостность данных или безопасность системы.
Выясним причину: если флажок «Безопасный режим» установлен в справочнике «Расширения», это может блокировать запись данных в определенные таблицы или ограничивать работу обработчиков событий. Попробуем временно снять этот флажок и флажок «Защита от опасных действий» в пользовательском режиме (Администрирование — Печатные формы, отчеты и обработки — Расширения), чтобы проверить, сохранится ли реквизит после этого.
Одной из самых коварных причин является некорректное использование программных перехватов. Если в расширении вы переопределили процедуры записи документа, данные могут не попадать в базу. Рассмотрим пример кода, который может приводить к ошибке:
&Вместо("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Какая-то логика
// Если здесь нет вызова ПродолжитьВызов(), стандартный механизм может быть нарушен
КонецПроцедуры
Проанализируем этот код. Использование аннотации &Вместо полностью заменяет основной код процедуры. Если в этой процедуре или в цепочке вызовов происходит очистка дополнительных свойств или не вызывается базовая логика записи, реквизит может не сохраниться. Рекомендуется использовать аннотации &Перед или &После, либо обязательно добавлять ПродолжитьВызов() внутри метода &Вместо.
Иногда проблема кроется не в коде, а в физическом состоянии таблиц SQL или файловой базы. При обновлении расширений иногда происходит сбой реструктуризации. Посмотрим, как принудительно обновить структуру:
F7 (Обновить конфигурацию базы данных).F7.Это заставит платформу заново проанализировать состав полей в таблицах базы данных и убедиться, что колонка для нового реквизита физически существует в SQL-таблице.
Кэш в 1С — это вечный источник странного поведения системы. Если конфигурация расширения была изменена, клиентское приложение может продолжать использовать старую структуру метаданных. В этом случае форма «думает», что реквизита нет, или сервер не принимает «незнакомое» поле. Рассмотрим способы очистки:
/ClearCache.1C:Enterprise 8.3 Server Agent и удаление содержимого папки snccntx в каталоге сервера.Если ваша база работает в модели сервиса (например, через «1С:Фреш» или собственное облако с использованием разделения данных), то к расширениям предъявляются особые требования. Реквизиты, добавленные в разделенные объекты, должны быть правильно зарегистрированы. Проанализируем свойство расширения Назначение. Для полноценной работы с данными обычно используется значение «Адаптация». Если установлено «Исправление», возможности работы с новыми данными могут быть ограничены платформой на уровне ядра.
Если вы работаете в РИБ, помните, что данные реквизитов расширений по умолчанию не участвуют в обмене. Рассмотрим ситуацию: вы добавили реквизит в подчиненном узле, записали его, но после синхронизации данные затерлись значениями из главного узла, где этого реквизита или данных в нем нет. Выясним, включено ли расширение в состав объектов обмена и как настроена миграция данных для новых полей.
Подводя итог, можно сказать, что в 90% случаев проблема решается либо настройкой прав доступа в самом расширении, либо проверкой пути к данным на форме. Пройдите по всем пунктам нашего чек-листа, и вы обязательно найдете причину, по которой ваш реквизит отказывается сохраняться.