Загрузить одну собственную строку и увидеть замену всей коллекции

Учебные задачи

Загрузить не объединяет строки по коду: предыдущие элементы удаляются, затем копируются строки входной таблицы в совпадающие колонки.

Где и как запускать

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. В учебной базе: Файл → Новый → Внешняя обработка. Создайте управляемую форму и назначьте её основной. Дайте обработке имя УчебнаяТаблица.

  2. Не добавляйте вручную реквизит Товары и одноимённые элементы: код создаст их при открытии. Модуль формы для этой задачи должен быть пустым.

  3. В свойствах формы → События свяжите ПриСозданииНаСервере с одноимённой процедурой. Сохраните отдельную учебную EPF и откройте через Файл → Открыть.

  4. Данные Книга/Ручка создаются в памяти формы. Справочники, документы и регистры вашей конфигурации не читаются и не записываются.

  5. Каждая команда сначала сбрасывает ТОЛЬКО собственный реквизит Товары к двум учебным строкам. Ручные изменения этой учебной таблицы при запуске задачи будут потеряны; рабочие формы не используйте.

  6. ДанныеФормыКоллекция не создаётся через Новый. Она возникает у реквизита формы, описанного как ТаблицаЗначений. Выгрузить/Загрузить выполняются только на сервере.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НовыеРеквизиты = Новый Массив;
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Товары", Новый ОписаниеТипов("ТаблицаЗначений")));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Код", Новый ОписаниеТипов("Строка"), "Товары", "Код"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Наименование", Новый ОписаниеТипов("Строка"), "Товары", "Название"));
    НовыеРеквизиты.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)), "Товары", "Количество"));
    ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)));

    СтрокаТовара = Данные.Добавить();
    СтрокаТовара.Код = "A-01";
    СтрокаТовара.Наименование = "Книга";
    СтрокаТовара.Количество = 3;
    СтрокаТовара = Данные.Добавить();
    СтрокаТовара.Код = "B-02";
    СтрокаТовара.Наименование = "Ручка";
    СтрокаТовара.Количество = 1;

    ЭтаФорма.ЗначениеВРеквизитФормы(Данные, "Товары");
    Таблица = ЭтаФорма.Элементы.Добавить("ТаблицаТоваров", Тип("ТаблицаФормы"));
    Таблица.ПутьКДанным = "Товары";
    Таблица.Заголовок = "Учебные товары";
    Таблица.Шапка = Истина;
    Таблица.АвтоВводНезаполненного = Ложь;
    Таблица.АвтоВводНовойСтроки = Ложь;
    Для Каждого ИмяКолонки Из СтрРазделить("Код,Наименование,Количество", ",") Цикл
        Колонка = Элементы.Добавить("Товары" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
        Колонка.Вид = ВидПоляФормы.ПолеВвода;
        Колонка.ПутьКДанным = "Товары." + ИмяКолонки;
        Колонка.Заголовок = ИмяКолонки;
    КонецЦикла;
    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Заменить только учебную коллекцию";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Процедура УчебноеДействие(Команда)
    СброситьТолькоУчебныеТовары();
    ЗагрузитьОдинУчебныйТоварНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Функция СоздатьДваУчебныхТовара()
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный)));
    Книга = Данные.Добавить();
    Книга.Код = "A-01";
    Книга.Наименование = "Книга";
    Книга.Количество = 3;
    Ручка = Данные.Добавить();
    Ручка.Код = "B-02";
    Ручка.Наименование = "Ручка";
    Ручка.Количество = 1;
    Возврат Данные;
КонецФункции

&НаСервере
Процедура СброситьТолькоУчебныеТовары()
    Товары.Загрузить(СоздатьДваУчебныхТовара());
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьОдинУчебныйТоварНаСервере()
    ТолькоКнига = СоздатьДваУчебныхТовара();
    ТолькоКнига.Удалить(1);
    ТолькоКнига[0].Количество = 7;
    Товары.Загрузить(ТолькоКнига);
    Сообщить(Товары.Количество() = 1);
    Сообщить(Товары.Получить(0).Код = "A-01");
    Сообщить(Товары.Получить(0).Наименование = "Книга");
    Сообщить(Товары.Получить(0).Количество = 7);
    Товары.Получить(0).Количество = 8;
    Сообщить(ТолькоКнига[0].Количество = 7);
КонецПроцедуры

Разбор по шагам

  1. Стартовый сброс даёт Книга/3 и Ручка/1 в собственной форме.

  2. Отдельная таблица с тремя правильными колонками сокращается до книги, количество меняется на 7.

  3. Загрузить выполняется на сервере и заменяет все прежние элементы коллекции. Ручка из формы исчезает.

  4. Колонки сопоставляются по идентификаторам, не по заголовкам видимых элементов.

  5. Меняем количество в загруженной форме на 8; входная таблица остаётся с 7, что показывает копирование числового значения.

Как проверить результат

  1. Пять логических проверок дают Истина.

  2. В конце формы ровно одна строка A-01/Книга/8, ручки нет. Ни товар, ни документ базы не изменён.

Ожидаемый результат

Показана замена содержимого собственной коллекции без ложного ожидания объединения по ключу.

На что обратить внимание

  1. Загрузить уничтожает прежние строки этой коллекции: не вызывайте вслепую в заполненном рабочем документе.

  2. Недостающие/не совпадающие по идентификаторам колонки не восстановят старые значения автоматически.

  3. Идентификаторы строк после полной замены нельзя считать прежними; текущую строку и связанные ссылки на строки нужно пересматривать.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.