Отличить список ключей от выборки данных настроек

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

ПолучитьСписок возвращает СписокЗначений с ключами; Выбрать возвращает курсор, у которого поля доступны после Следующий.

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

Полный серверный общий модуль только собственной отдельной учебной базы; сохранение здесь реальное.

Подготовка

  1. Только собственная отдельная учебная база 8.5.1.1343 с конфигурацией УчебнаяКонфигурацияСинтаксиса. Не запускайте уроки сохранения в КА2/УНФ/УТ/БП или их рабочем сеансе.

  2. В своей учебной базе создайте пользователя с точным именем guide-owned-user и войдите под ним. В собственной учебной роли разрешите СохранениеДанныхПользователя. Не расширяйте права рабочего пользователя.

  3. Создайте общий модуль УчебноеХранилищеНастроек с флагом Сервер. Каждый урок — отдельный полный модуль с ВыполнитьПример() Экспорт, вызванный из серверной учебной команды.

  4. Уроки сохранения действительно пишут настройки в учебную базу. Новый ключ объекта содержит собственный UUID; перед записью проверяется отсутствие записи, после опыта удаляется только созданная запись.

  5. Личный вариант использует стандартное хранилище общих настроек текущего учебного пользователя; вариант по умолчанию — только ХранилищеСистемныхНастроек.

  6. При ошибке очистки сохраните сообщение с собственным ключом для точечной проверки в этой учебной базе. Не удаляйте все настройки и не подставляйте Неопределено в аргументы удаления.

Процедура ВыполнитьПример() Экспорт
    ПользовательУрока = ИмяПользователя();
    Если ПользовательУрока <> "guide-owned-user" Тогда
        ВызватьИсключение "Войдите под собственным учебным пользователем guide-owned-user";
    КонецЕсли;
    КлючОбъекта = "guide-owned-settings-" + Строка(Новый УникальныйИдентификатор);
    КлючНастроек = "guide-book-view";
    Хранилище = ПолучитьСтандартноеХранилищеОбщихНастроек();
    Отбор = Новый Структура("КлючОбъекта,КлючНастроек,Пользователь", КлючОбъекта, КлючНастроек, ПользовательУрока);
    Проверка = Хранилище.Выбрать(Отбор);
    Если Проверка.Следующий() Тогда
        ВызватьИсключение "Новый ключ уже занят: никакая существующая настройка не заменяется";
    КонецЕсли;
    Описание = Новый ОписаниеНастроек;
    Описание.КлючОбъекта = КлючОбъекта;
    Описание.КлючНастроек = КлючНастроек;
    Описание.Пользователь = ПользовательУрока;
    Описание.Представление = "Учебный вид Книга, количество 3";
    Описание.ДополнительныеСвойства.Вставить("Источник", "Собственная учебная обработка");
    Настройки = Новый Структура("Товар,Количество,ПоказыватьСумму", "Книга", 3, Истина);
    Создано = Ложь;
    ОшибкаОперации = "";
    ОшибкаОчистки = "";
    Попытка
        Хранилище.Сохранить(КлючОбъекта, КлючНастроек, Настройки, Описание, ПользовательУрока);
        Создано = Истина;
        Список = Хранилище.ПолучитьСписок(КлючОбъекта, ПользовательУрока);
        Сообщить(Список.Количество() = 1);
        Сообщить(Список.Получить(0).Значение = КлючНастроек);
        Выборка = Хранилище.Выбрать(Отбор);
        Строк = 0;
        Пока Выборка.Следующий() Цикл
            Строк = Строк + 1;
            Сообщить(Выборка.КлючОбъекта = КлючОбъекта);
            Сообщить(Выборка.КлючНастроек = КлючНастроек);
            Сообщить(Выборка.Пользователь = ПользовательУрока);
            Сообщить(Выборка.Представление = "Учебный вид Книга, количество 3");
            Сообщить(ТипЗнч(Выборка.ДатаИзменения) = Тип("Дата"));
            Сообщить(Выборка.Настройки.Количество = 3);
        КонецЦикла;
        Сообщить(Строк = 1);
    Исключение
        ОшибкаОперации = ОписаниеОшибки();
    КонецПопытки;
    Если Создано Тогда
        Попытка
            Хранилище.Удалить(КлючОбъекта, КлючНастроек, ПользовательУрока);
            Сообщить(Хранилище.Загрузить(КлючОбъекта, КлючНастроек, , ПользовательУрока) = Неопределено);
        Исключение
            ОшибкаОчистки = ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Если НЕ ПустаяСтрока(ОшибкаОперации) ИЛИ НЕ ПустаяСтрока(ОшибкаОчистки) Тогда
        ВызватьИсключение "Ошибка учебной настройки " + КлючОбъекта + "/" + КлючНастроек
            + ": " + ОшибкаОперации + " Очистка: " + ОшибкаОчистки
            + " При неопределённом результате записи проверьте только этот собственный ключ в учебной базе";
    КонецЕсли;
    Сообщить("Собственная настройка удалена. Другие ключи и пользователи не затронуты");
КонецПроцедуры

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

  1. Создаём ровно одну собственную запись под новым ключом объекта.

  2. ПолучитьСписок ограничиваем этим объектом и текущим учебным пользователем. Значение элемента списка — ключ настройки, не её структура.

  3. Выбрать получает отбор по всем трём полям, поэтому не требует просмотра чужих пользователей.

  4. В цикле Следующий читаем шесть свойств выборки: ключи, пользователя, подпись, дату и данные.

  5. ДатаИзменения проверяется как Дата; не выдаём её за UTC или точно равную моменту начала урока.

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

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

  1. Девять сравнений списка/выборки и десятый контроль удаления — Истина.

  2. В Значение списка находится guide-book-view, в Настройки выборки — структура с количеством 3.

  3. Выборка не используется до успешного Следующий.

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

Разобраны два разных представления одного собственного варианта настроек.

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

  1. Выбрать без отбора пользователя может потребовать АдминистрированиеДанных: не убирайте наш отбор.

  2. Список не является массивом структур настроек; нельзя обращаться к Список[0].Количество как к товару.

  3. Курсор выборки не создаётся через Новый: его возвращает менеджер.

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

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

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

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

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