Перенести массив дат по индексам и полностью заменить черновик

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

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

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

Полный серверный общий модуль УчебныеНаборыПоследовательности85 собственной новой конфигурации УчебныеПоследовательности85, точная 8.5.1.1343. Только собственный черновик памяти; 1С здесь не запускалась, записей базы нет.

Подготовка

  1. Создайте новую отдельную пустую базу 8.5.1.1343, не копию рабочей УТ/КА2. Имя конфигурации УчебныеПоследовательности85, язык встроенного языка Русский, ОсновнойРежимЗапуска=УправляемоеПриложение, режим совместимости Не использовать. Расширений, подписок и обработчиков записи нет.

  2. В Документы создайте единственный документ УчебнаяРегистрация85: проведение запрещено, реквизитов и табличных частей нет, движения регистров не назначены, модули объекта и менеджера пусты. Документы этого вида в уроке не создаются и не записываются.

  3. В Последовательности создайте единственную УчебнаяОчередь85. В составе Документы выберите только свой УчебнаяРегистрация85. Измерений, зависимых регистров в составе Движения и дополнительных индексов нет. ПеремещениеГраницыПриПроведении=НеПеремещать. Модуль набора пуст. Структура записей поэтому содержит только Период и Регистратор.

  4. Не создавайте в стенде справочников и регистров. Для учебного пользователя разрешите собственные метаданные, общую форму и команды. Обновите только эту новую конфигурацию. Проверка имени и состава схемы выполняется до создания набора; она не доказывает отсутствия записей базы и не делает рабочую базу безопасной.

  5. В Общие → Общие модули создайте УчебныеНаборыПоследовательности85: Сервер=Истина, ВызовСервера=Истина, Глобальный=Ложь, клиентские флаги выключены. Полный основной модуль одного выбранного урока вставьте на верхнем уровне целиком. Все помощники предоставлены ниже в том же модуле.

  6. В Общие → Общие формы создайте управляемую форму УчебныйЗапускПоследовательности85. Добавьте команду ВыполнитьУрок с действием ВыполнитьУрок, ИзменяетСохраняемыеДанные=Ложь и кнопку Выполнить урок. Полный модуль формы:
    &НаКлиенте
    Процедура ВыполнитьУрок(Команда)
    ВыполнитьУрокНаСервере();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ВыполнитьУрокНаСервере()
    УчебныеНаборыПоследовательности85.ВыполнитьПример();
    КонецПроцедуры

  7. В Общие → Общие команды создайте ОткрытьНаборПоследовательности85 без параметра и включите в свой учебный раздел. Полный модуль общей команды:
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ОткрытьФорму("ОбщаяФорма.УчебныйЗапускПоследовательности85");
    КонецПроцедуры
    Откройте свою форму этой командой и выполните её кнопку. Два вспомогательных модуля не вставляйте в основной серверный модуль.

  8. Плановые ссылки создаются ПолучитьСсылку на собственные новые UUID. Непустая ссылка не означает существующий документ; реквизиты ссылок не читаются. Это идентификаторы собственных незаписанных черновых строк, не готовые записи для сохранения в базу.

  9. Здесь нет Прочитать, Записать, проведения, восстановления или изменения границы. Добавить/Загрузить/Удалить/Очистить действуют только на принадлежащий уроку экземпляр набора в памяти. Этот пример нельзя превращать в исправление последовательности добавлением Записать.

  10. Статически проверены исходный код и установленная справка. Компиляция и выполнение в 1С здесь не проверялись; ожидаемые результаты далее нужно подтвердить самостоятельным запуском только в подготовленной новой учебной базе.

Процедура ВыполнитьПример() Экспорт
    Если Метаданные.Последовательности.Количество() <> 1 Или Метаданные.Документы.Количество() <> 1 Тогда
        ВызватьИсключение "В своём стенде нужны ровно одна последовательность и один вид документа";
    КонецЕсли;
    МетаОчереди = Метаданные.Последовательности.Найти("УчебнаяОчередь85");
    МетаДокумента = Метаданные.Документы.Найти("УчебнаяРегистрация85");
    Если МетаОчереди = Неопределено Или МетаДокумента = Неопределено Тогда
        ВызватьИсключение "Не подготовлена собственная схема урока";
    КонецЕсли;
    Если МетаОчереди.Измерения.Количество() <> 0 Или МетаОчереди.Движения.Количество() <> 0
        Или МетаОчереди.Документы.Количество() <> 1 Тогда
        ВызватьИсключение "Нужна собственная очередь без измерений и зависимых регистров";
    КонецЕсли;
    Участвует = Ложь;
    Для Каждого МетаУчастника Из МетаОчереди.Документы Цикл
        Участвует = МетаУчастника = МетаДокумента;
    КонецЦикла;
    Если Не Участвует Тогда
        ВызватьИсключение "Единственный участник должен быть своим УчебнаяРегистрация85";
    КонецЕсли;
    Если МетаОчереди.ПеремещениеГраницыПриПроведении <> Метаданные.СвойстваОбъектов.ПеремещениеГраницыПриПроведении.НеПеремещать Тогда
        ВызватьИсключение "Проверьте подготовку политики границы собственной очереди";
    КонецЕсли;
    Набор = Последовательности.УчебнаяОчередь85.СоздатьНаборЗаписей();
    Если Набор.Количество() <> 0 Или Набор.Метаданные() <> МетаОчереди Тогда
        ВызватьИсключение "Ожидался новый пустой набор собственной последовательности";
    КонецЕсли;
    Ссылки = Новый Массив;
    Для Номер = 1 По 3 Цикл
        Ссылки.Добавить(Документы.УчебнаяРегистрация85.ПолучитьСсылку(Новый УникальныйИдентификатор));
    КонецЦикла;
    ДобавитьСвоюЗапись(Набор, Дата(2026, 1, 1), Ссылки[0]);
    ДобавитьСвоюЗапись(Набор, Дата(2026, 2, 1), Ссылки[1]);
    ДобавитьСвоюЗапись(Набор, Дата(2026, 3, 1), Ссылки[2]);
    НовыеПериоды = Новый Массив;
    НовыеПериоды.Добавить(Дата(2026, 4, 1));
    НовыеПериоды.Добавить(Дата(2026, 5, 1));
    НовыеПериоды.Добавить(Дата(2026, 6, 1));
    Если НовыеПериоды.Количество() <> Набор.Количество() Тогда
        ВызватьИсключение "Наш массив обязан иметь ровно по одному значению для каждой строки";
    КонецЕсли;
    Для Каждого Период Из НовыеПериоды Цикл
        Если ТипЗнч(Период) <> Тип("Дата") Тогда
            ВызватьИсключение "В собственном массиве допускаются только даты";
        КонецЕсли;
    КонецЦикла;
    Набор.ЗагрузитьКолонку(НовыеПериоды, "Период");
    Для ИндексСтроки = 0 По 2 Цикл
        ПроверитьСвоюЗапись(Набор[ИндексСтроки], НовыеПериоды[ИндексСтроки], Ссылки[ИндексСтроки]);
    КонецЦикла;
    Замена = Набор.ВыгрузитьКолонки("Период,Регистратор");
    Для ИндексСтроки = 0 По 1 Цикл
        СтрокаЗамены = Замена.Добавить();
        СтрокаЗамены.Период = Дата(2026, ИндексСтроки + 7, 1);
        СтрокаЗамены.Регистратор = Ссылки[ИндексСтроки + 1];
    КонецЦикла;
    Набор.Загрузить(Замена);
    Если Набор.Количество() <> 2 Тогда
        ВызватьИсключение "Загрузить заменяет прежние три строки двумя, не добавляет их";
    КонецЕсли;
    Для ИндексСтроки = 0 По 1 Цикл
        ПроверитьСвоюЗапись(Набор[ИндексСтроки], Дата(2026, ИндексСтроки + 7, 1), Ссылки[ИндексСтроки + 1]);
    КонецЦикла;
    Замена[0].Период = Дата(2026, 12, 1);
    ПроверитьСвоюЗапись(Набор[0], Дата(2026, 7, 1), Ссылки[1]);
    ПроверитьСвоюЗапись(Набор[1], Дата(2026, 8, 1), Ссылки[2]);
    Сообщить("В памяти сначала апрель/май/июнь, после полной замены июль/август; база не читалась");
КонецПроцедуры

Процедура ДобавитьСвоюЗапись(Набор, Период, Регистратор)
    Если ТипЗнч(Период) <> Тип("Дата") Или ТипЗнч(Регистратор) <> Тип("ДокументСсылка.УчебнаяРегистрация85") Тогда
        ВызватьИсключение "Переданы неверные собственные ключи строки";
    КонецЕсли;
    Запись = Набор.Добавить();
    Запись.Период = Период;
    Запись.Регистратор = Регистратор;
КонецПроцедуры

Процедура ПроверитьСвоюЗапись(Запись, Период, Регистратор)
    Если ТипЗнч(Запись.Период) <> Тип("Дата") Или ТипЗнч(Запись.Регистратор) <> Тип("ДокументСсылка.УчебнаяРегистрация85") Тогда
        ВызватьИсключение "Типы фактической собственной записи не совпали";
    КонецЕсли;
    Если Запись.Период <> Период Или Запись.Регистратор <> Регистратор Тогда
        ВызватьИсключение "Период или регистратор собственной записи не совпал";
    КонецЕсли;
КонецПроцедуры

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

  1. Создать свои три исходные регистрации января–марта с разными плановыми ссылками.

  2. Наполнить отдельный Массив тремя датами апреля–июня через Добавить. Размер и тип каждого элемента проверяются до загрузки.

  3. Вызвать ЗагрузитьКолонку(НовыеПериоды,"Период") и проверить все три новые даты вместе с неизменными регистраторами.

  4. Получить пустую таблицу точной схемы через ВыгрузитьКолонки и добавить две свои строки июля и августа с собственными второй и третьей ссылками.

  5. Загрузить(Замена) должно оставить две записи: проверить размер и оба поля каждой. Это замена, не добавление до пяти.

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

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

  1. После загрузки колонки: апрель/ссылка1, май/ссылка2, июнь/ссылка3 в текущем порядке индексов.

  2. После полной замены ровно июль/ссылка2 и август/ссылка3; изменение таблицы-источника не меняет обе записи.

  3. Нет чтения или записи базы. Поведение более коротких/длинных массивов намеренно не предполагается: свой массив проверяется на точное совпадение длины.

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

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

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

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

  2. Плановые ссылки принадлежат своему типу, но документы не записаны. Не читайте у них дату/номер и не объявляйте их существующими.

  3. Для индексных методов нумерация с нуля. После удаления индексы оставшихся строк меняются; ссылка на строку и её текущий индекс — разные вещи.

  4. Удалить и Очистить здесь удаляют лишь черновые строки памяти. Они не отменяют документ и не исправляют границу последовательности.

  5. Readonly-свойство набора нельзя заменить новым значением. ДополнительныеСвойства допускает работу с содержимым возвращённой структуры, не присваивание новой структуры свойству.

  6. Модифицированность не обнаруживает изменения других пользователей и не подтверждает сохранение. ЭтотОбъект относится к модулю набора; в общем модуле данного урока не применяется.

  7. Python-тесты не исполняют платформу. Полный модуль надо отдельно скомпилировать и испытать в собственной подготовленной конфигурации; рабочие данные здесь не менялись.

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

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

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

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

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