CRM4DEV-966 - Получение подробных данных проблемы... СТАТУС

Подробное техническое описание реализованной логики работы с элементом формы "ВидРасчетаСписок", разработанной в рамках задачи CRM4DEV-966. Описание подготовлено для передачи другому программисту и позволяет понять, как работает механизм отображения и сохранения выбранных значений из выпадающего списка (множественный выбор), а также как обеспечивается контроль изменений.


screenshot-3.png

📄 Описание логики обработки множественного выбора: ВидРасчетаСписок

1. Общее назначение

Механизм предназначен для отображения и управления списком выбранных "видов расчёта" в документе "Реализация недвижимости". Он реализует:

  • Загрузку ранее выбранных значений при открытии документа.
  • Отображение этих значений в элементе формы ВидРасчетаСписок (тип — список со множественным выбором).
  • Контроль изменений пользователем.
  • Автоматическое сохранение изменений в регистр сведений при записи документа.

✅ Это позволяет гибко управлять финансовыми параметрами договора на основе выбранных типов расчётов.


2. Используемые объекты конфигурации

ОбъектНазначение
РегистрСведений.Дев_ВидыРасчетовДоговоровХранит связь: ДоговорВидРасчета.
Перечисление.Дев_ВидыРасчетовСодержит список возможных видов расчётов (например, "Аванс", "Оплата по этапам", "Единовременно").
Реквизит формы ВидРасчетаСписокЭлемент управления на форме для отображения и редактирования выбранных значений.
Реквизит формы ВидРасчетаСписокБуферБуферная копия ВидРасчетаСписок для сравнения изменений.

⚠️ Реквизиты ВидРасчетаСписок и ВидРасчетаСписокБуфер должны быть объявлены на форме как свойства типа СписокЗначений.


3. Логика работы — пошагово

🔁 Этап 1: При открытии документа (ПриСозданииНаСервере)

Вызывается процедура:

ЗаполнитьВидРасчетаСписок();

Алгоритм:

  1. Проверяется, что документ уже создан (Объект.Ссылка <> Неопределено).
  2. Формируется запрос к регистру Дев_ВидыРасчетовДоговоров:
    ПараметрыОтбора.Договор = Объект.Ссылка;
    
  3. Выполняется чтение всех записей для текущего договора.
  4. Для каждой найденной записи:
    • Значение ВидРасчета добавляется в ВидРасчетаСписок.
    • То же значение добавляется в буфер ВидРасчетаСписокБуфер.

✅ Таким образом, при открытии документа отображаются все ранее сохранённые виды расчётов.


🔁 Этап 2: При редактировании пользователем

Пользователь может:

  • Добавить новые значения.
  • Удалить существующие.

Изменения фиксируются только в реквизите ВидРасчетаСписок, а ВидРасчетаСписокБуфер остаётся неизменным до момента сохранения.


🔁 Этап 3: При записи документа (ПриЗаписиНаСервере)

Если Не ОбщегоНазначенияКлиентСервер.СпискиЗначенийИдентичны(ВидРасчетаСписок, ВидРасчетаСписокБуфер) Тогда
    ЗаписатьДанныеВидовРасчетаДоговора();
КонецЕсли;

Алгоритм:

  1. Происходит сравнение двух списков:
    • Текущий (ВидРасчетаСписок) — после редактирования.
    • Буферный (ВидРасчетаСписокБуфер) — состояние на момент открытия.
  2. Если списки не идентичны — вызывается сохранение.

🔁 Этап 4: Сохранение изменений (ЗаписатьДанныеВидовРасчетаДоговора())

Процедура выполняет следующие действия:

МенеджерРегистра = РегистрыСведений.Дев_ВидыРасчетовДоговоров;
ТзДляЗаполнения = МенеджерРегистра.ТаблицаЗначенийПараметровДляЗаписиВРегистр();
  1. Формируется новая таблица значений для записи в регистр.

  2. Все текущие значения из ВидРасчетаСписок добавляются в таблицу:

    Для Каждого Эл Из ВидРасчетаСписок Цикл
        НоваяСтрока = ТзДляЗаполнения.Добавить();
        НоваяСтрока.Договор = Объект.Ссылка;
        НоваяСтрока.ВидРасчета = Эл.Значение;
    КонецЦикла;
    
  3. Выполняется полная замена данных в регистре:

    МенеджерРегистра.ЗаписатьЗначения(ПараметрыЗаписи);
    

    ⚠️ Это означает, что все старые записи удаляются, и вместо них создаются новые.

  4. Буфер обновляется:

    ВидРасчетаСписокБуфер.Очистить();
    ВидРасчетаСписокБуфер.ЗагрузитьЗначения(ВидРасчетаСписок.ВыгрузитьЗначения());
    

✅ После этого механизм готов к следующему циклу редактирования.


4. Диаграмма последовательности

Пользователь открывает документ
        ↓
ПриСозданииНаСервере()
        ↓
ЗаполнитьВидРасчетаСписок()
        ↓
Чтение из Регистра: Дев_ВидыРасчетовДоговоров
        ↓
Заполнение: ВидРасчетаСписок + ВидРасчетаСписокБуфер
        ↓
Пользователь редактирует список
        ↓
ПриЗаписиНаСервере()
        ↓
Сравнение: ВидРасчетаСписок ≠ ВидРасчетаСписокБуфер?
        ↓ Да
ЗаписатьДанныеВидовРасчетаДоговора()
        ↓
Удаление старых записей + создание новых в регистре
        ↓
Обновление буфера
        ↓
Документ сохранён

5. Что уже реализовано

ФункцияРеализованоКомментарий
Загрузка значений при открытииЧерез ЗаполнитьВидРасчетаСписок()
Отображение в интерфейсеЧерез элемент СписокЗначений
Контроль измененийСравнение через СпискиЗначенийИдентичны()
Сохранение в регистрПолная перезапись данных
Поддержка множественного выбораРаботает с массивом значений
Обновление буфера после сохраненияГарантирует актуальность состояния

6. Преимущества подхода

  • Простота и надёжность: используется стандартный механизм СписокЗначений.
  • Гибкость: легко масштабируется на другие справочники.
  • Эффективность: нет лишних запросов при отсутствии изменений.
  • Аудируемость: все изменения хранятся в регистре сведений.

7. Возможные улучшения

НаправлениеРекомендация
Частичное обновление регистраСейчас удаляются все записи. Можно реализовать дифф: удалить только исключённые, добавить новые.
Журнал измененийДобавить запись в журнал регистрации при изменении состава.
Подтверждение при удаленииЕсли удаляется важный вид расчёта — спросить подтверждение.
Валидация набораПроверять, что выбран хотя бы один обязательный вид расчёта.
Расшифровка в отчётахСоздать СКД-отчёт по видам расчётов по договорам.

8. Пример использования

Сценарий:
Пользователь открыл договор №100 на реализацию квартиры.
В регистре есть записи:

  • Аванс
  • Оплата по этапам

При открытии они отобразились в поле "Виды расчётов".
Пользователь убрал "Оплата по этапам", добавил "Единовременно".

При сохранении:

  1. Система сравнила списки — нашла отличие.
  2. Удалила старые записи из Дев_ВидыРасчетовДоговоров.
  3. Записала новые:
    • Аванс
    • Единовременно
  4. Обновила буфер.

9. Заключение

Реализованный механизм — надёжное и гибкое решение для управления множественными ссылками в документе. Он соответствует лучшим практикам 1С:

  • Разделение чтения и записи.
  • Контроль изменений.
  • Использование буфера.
  • Чистая интеграция с формой и регистром.

Документ подготовлен так, чтобы новый программист мог:

  • Понять логику без чтения кода.
  • Безопасно доработать функционал.
  • Перенести подход на другие объекты.

  • Нет меток