Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 фев 2025, 16:35

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

Автор Глеб Шахов, 21 янв 2025, 09:52

0 Пользователей и 1 гость просматривают эту тему.

Глеб Шахов

Всем, привет, подскажите, пожалуйста. Стоит задача - Регистр сведений, в котором у пользователя может быть несколько контрагентов, но лишь один по умолчанию. Реализовал таким образом. Смысл в том, что если я проверяю в регистре, то все норм отрабатывает. Для проверки создал ещё внешнюю обработку, где, например, я создаю сразу две записи пользователя с контрагентами и у обоих значение по умолчанию. Выдает ошибку, что запись невозможна. Вообще может как-то иначе можно делать проверку, а не через приведение  НезаписанныхДанныхПользователя.ПоУмолчанию к числовому типу. И если допустим я вновь буду вносить контрагента со значением по умолчанию совпадающим со значением в базе, получается мне в цикле, когда запрос возвращает непустой результат, надо проверять строчки из выгрузки с результатом и если совпадает, то допускать к записи?

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

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   сп_СвязьПользователяСКонтрагентами.Пользователь КАК Пользователь,
        |   сп_СвязьПользователяСКонтрагентами.Контрагент КАК Контрагент,
        |   сп_СвязьПользователяСКонтрагентами.ПоУмолчанию КАК ПоУмолчанию
        |ИЗ
        |   РегистрСведений.сп_СвязьПользователяСКонтрагентами КАК сп_СвязьПользователяСКонтрагентами
        |ГДЕ
        |   сп_СвязьПользователяСКонтрагентами.Пользователь В(&Пользователи)
        |   И сп_СвязьПользователяСКонтрагентами.ПоУмолчанию";

Запрос.УстановитьПараметр("Пользователи", МассивПользователей);

РезультатЗапроса = Запрос.Выполнить();
ЧислоПоУмолчанию = 0;
Если РезультатЗапроса.Пустой() Тогда
Для каждого НезаписанныхДанныхПользователя Из ТаблицаНабораЗаписей Цикл
//Число(НезаписанныхДанныхПользователя.ПоУмолчанию) в случае флага "Истина" = 1, если Ложь = 0;
//т.е. у нас может быть только 1, если больше значит отказываем
ЧислоПоУмолчанию = ЧислоПоУмолчанию + Число(НезаписанныхДанныхПользователя.ПоУмолчанию);
Если ЧислоПоУмолчанию > 1 Тогда
Сообщить("Вы пытаетесь записать несколько значений по умолчанию!!!");
Отказ = Истина;
Возврат;
КонецЕсли;

КонецЦикла;
Иначе
Сообщить("У пользователя уже есть значение по умолчанию!!!");
Отказ = Истина;
Возврат;
КонецЕсли;

КонецПроцедуры

LexaK

Глеб Шахов, Когда получаете эту таблицу ТаблицаНабораЗаписей
сверните ее по полям Пользователь и Контрагент
затем верните в нее отметки ПоУмолчанию (хотя должна быть всего одна)
и если не выпали в Отках, то эту же таблицу и загрузите в НЗ.

(а зачем запрос к регистру делаете? если происходит запись новых данных?)
и не увидел учет очистки НЗ (при перезаписи вроде как очистка  сначала идет
вот тут может быть я не прав, давно с регистрами не работал)

вообще, как бы в модуле регистра какие-то такие обработки писать не очень.
попробуйте проверять данные в форме или в модуле где вы их получаете
если помогло нажмите: Спасибо!

Глеб Шахов

LexaK,
Цитировать(а зачем запрос к регистру делаете? если происходит запись новых данных?)
типа если какие-то данные были у пользователя по умолчанию, тогда не даю записать
а если не было, то проверяю чтобы у двух записей не было сразу полей по умолчанию перед тем как нажму записать( а это уже во внешней обработке) и то я бы внешней не проверял, это человек, который дал задание, так проверил и вернул обратно.

Цитироватьвообще, как бы в модуле регистра какие-то такие обработки писать не очень.
попробуйте проверять данные в форме или в модуле где вы их получаете

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

Мне надо было через регистр сделать связь между пользователем и контрагентами, я их сделал измерениями, а ресурсом "по умолчанию"(булево)

LexaK

Глеб Шахов,
Цитироватьтогда не даю записать
не верно.

любые (по крайней мере большинство) данные могут быть переписаны
изменились настройки, сменился контрагент и т.д.

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

Пользователь уже имеет контрагента по умолчанию!
Хотите переписать? Да/Нет

и т.д.
если помогло нажмите: Спасибо!

LexaK

Глеб Шахов, какие измерения (структура данных) у регистра?
если помогло нажмите: Спасибо!

Глеб Шахов

LexaK, измерения пользователь и контрагент, ресурс реквизит "ПоУмолчанию" типа булева

Глеб Шахов

LexaK,
Цитироватьдавно с регистрами не работал

а я почти что первый раз. делал какие-то небольшие движения по докам. еще и с запросами хромаю

LexaK

Глеб Шахов, ваш регистр независимый
в него удобно писать Наборами записей
с установкой отбора по Пользователю
сделайте независимую форму,
на ней ТЗ. при открытии заполняйте эту ТЗ данными из регистра
сможете редактировать ТЗ, добавляете/удаляете строчки, меняете отметку поУмолчанию
и по кнопке Записать, проверяете ТЗ на дублирование, пустые значения, отметки Умолчания
помещаете ТЗ в НЗ и записываете.
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск