Почему не сохраняются данные при записи элемента справочника в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При самостоятельной разработке или доработке конфигураций 1С начинающие разработчики часто сталкиваются с ситуацией: пользователь вводит числовые или строковые данные на форме элемента справочника, нажимает кнопку сохранения, но после закрытия или переоткрытия формы все поля сбрасываются в ноль или остаются пустыми. Рассмотрим подробно, почему возникает подобное поведение платформы, как связать элементы формы с базой данных и как с точки зрения архитектуры 1С правильно вести учет остатков и сумм.

Причина 1. Реквизит формы не связан с реквизитом объекта базы данных

Самая распространенная техническая ошибка при проектировании формы — создание локального реквизита формы вместо использования реквизита прикладного объекта. Если создать реквизит непосредственно в ветке формы, его значение существует исключительно в памяти клиентского сеанса во время работы с этой формой. При нажатии кнопки «Записать» платформа сохраняет в базу только данные объекта метаданных, а локальные реквизиты формы очищаются при перечитывании или закрытии.

Разберем по шагам, как правильно создать и привязать реквизит в управляемой форме:

  1. Откроем дерево метаданных конфигурации, найдем нужный справочник и раскроем ветку Реквизиты.
  2. Добавим новый реквизит (например, Сумма) и установим для него подходящий тип данных (например, Число с нужной длиной и точностью).
  3. Откроем форму элемента справочника в редакторе форм.
  4. В правой панели редактора формы перейдем на вкладку Реквизиты и раскроем основной реквизит Объект. Убедимся, что созданный реквизит отображается внутри структуры объекта.
  5. Перетащим реквизит из ветки Объект в левую панель Элементы либо выделим уже существующее поле ввода и в окне свойств проверим параметр Путь к данным. В нем обязательно должно быть указано значение Объект.ИмяРеквизита, а не просто ИмяРеквизита.

В обычном приложении аналогичная привязка выполняется в палитре свойств элемента управления формы через параметр Данные, где выбирается соответствующее поле справочника.

Причина 2. Очистка значений в обработчиках событий при записи

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

  1. В модуле формы: процедуры ПередЗаписьюНаСервере, ПриЗаписиНаСервере или ПослеЗаписиНаСервере могут содержать код, который сбрасывает значения или повторно инициализирует форму.
  2. В модуле объекта справочника: события ПередЗаписью или ПриЗаписи могут принудительно изменять свойства объекта.
  3. В процедурах чтения: ПриЧтенииСозданииНаСервере или ПриСозданииНаСервере может выполняться ошибочное заполнение по умолчанию.

Для диагностики расставим точки останова в отладчике и проверим значения на каждом этапе передачи данных с клиента на сервер:


// В модуле формы
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    // Проверяем значение реквизита в объекте перед его записью
    ЗначениеСуммы = ТекущийОбъект.Сумма;
КонецПроцедуры

// В модуле объекта справочника
Процедура ПередЗаписью(Отказ)
    // Проверяем, не затирается ли реквизит логикой модуля объекта
    Если ЭтотОбъект.Сумма = 0 Тогда
        // Точка останова для анализа причин обнуления
    КонецЕсли;
КонецПроцедуры

Архитектурные особенности: почему справочники не проводятся

Выясним важное концептуальное отличие объектов платформы «1С:Предприятие». В платформе 1С справочники не поддерживают операцию проведения. Проведение — это механизм формирования движений по регистрам учета, который доступен исключительно документам. Справочник предназначен только для хранения условно-постоянной нормативно-справочной информации (НСИ) и может быть только записан.

Хранить текущие остатки (финансовые, складские или количественные) непосредственно в реквизитах справочника архитектурно неверно по следующим причинам:

  1. Остатки меняются во времени под воздействием хозяйственных операций, поэтому требуют фиксации истории движений и хронологии.
  2. При одновременной работе нескольких пользователей запись остатка напрямую в справочник приводит к блокировкам и риску потери актуальности данных.

Как правильно организовать учет и отображение остатков

Рассмотрим стандартный паттерн разработки в 1С для работы с остатками и суммами:

  1. Формирование движений через документы: создается документ (например, ПринятиеКУчету или ПоступлениеТоваров), который при проведении делает записи в регистр накопления или регистр бухгалтерии.
  2. Отображение на форме справочника: если требуется видеть актуальный остаток прямо в карточке справочника, на форме создается дополнительный реквизит (например, ТекущийОстаток с признаком ТолькоПросмотр = Истина).
  3. Получение данных из регистра: при открытии формы выполняется запрос к виртуальной таблице остатков регистра с отбором по текущему элементу.

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


&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Остатки.СуммаОстаток КАК Остаток
        |ИЗ
        |	РегистрНакопления.Взаиморасчеты.Остатки(, Средство = &Средство) КАК Остатки";
    
    Запрос.УстановитьПараметр("Средство", Объект.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        ЭтаФорма.ТекущийОстаток = Выборка.Остаток;
    Иначе
        ЭтаФорма.ТекущийОстаток = 0;
    КонецЕсли;
КонецПроцедуры

Таким образом, для статичных данных достаточно связать элемент формы с реквизитом Объект.ИмяРеквизита, а динамические учетные показатели необходимо рассчитывать на основе регистров и проведенных документов.

← На главную