Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
17 сен 2021, 19:08

Уникальность значения табличного реквизита во всем справочнике (Управляемая форма) .

Автор oooo800, 28 авг 2020, 14:40

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

oooo800

Самописная конфигурация, платформа 8.3.16, управляемые формы.
Есть справочник с табличной частью, в которой есть реквизит, значение которого должно быть уникально в рамках всего справочника.
Строки в табличной части любого элемента могут добавлять/меняться/удаляться.
Соответственно, этот "супер уникальный" реквизит может быть изменен.
Но если уже есть где-то, в этом же элементе или в другом строка с таким же значение этого реквизита то такой элемент быть записан не может.

Реализация через событие "ПередЗаписьюНаСервере" формы элемента справочника.

Как лучше это сделать для Толстого/Тонкого/Веб клиента с учетом быстродействия и совместной работы ?

Получается, как минимум надо перебирать все строки ТЧ записываемого элемента, чтобы получить значение этого реквизита строки. И его значение уже анализировать на наличие (уже) в справочнике.
Лучше конечно перебирать только добавленные/измененные строки ТЧ элемента.
Потому что, "не тронутые" строки будут "сигнализировать" о том, что такое значение реквизита уже есть.

Или есть какие-то варианты быстрее - лучше ?

LexaK

в табличной части может быть несколько колонок, например 10
при заполнении элемента справочника, вы заполнили табличную часть, 100 строчек ТЧ по 10 колонок/реквизитов каждая
вопрос?
какое значение Строка - колонка, должно является уникальным? по которому надо делать проверку? 
ответ Понравился? (в смысле пригодился?)

oooo800

Если правильно понял вопрос: по одной колонке, НО по ВСЕМ строкам ВСЕХ элементов справочника, в том числе еще находящихся в редактировании (не записанных) элементов (читай строк)
Это сродни сквозной нумерации в бухгалтерии, когда порядковый номер не повторяется нигде, ни в одном журнале по месяцам в течение года.

Но мог не правильно понять вопрос (голова по этому поводу загружена донельзя) .

Пример:
реквизиты ТЧ (они же колонки Таблицы формы) :
id описание комментарий

Открываем форму элемента с Наименование = "Узел15" и видим:
"h254"   "деталь 254"       "бла-бла-бла"
"wu1988" "деталь не важная" "бла-бла-бла"


в другом элементе с Наименование="Двигатель34" в ТЧ есть такая строка:
"u96" "винт" "бла-бла-бла"

пользователь в элементе "Узел15" меняет строку:
"h254"   "деталь 254"       "бла-бла-бла"
на
"u96"   "деталь 25411"       "бла-бла-бла"
и
копирует строку текущего элемента
"wu1988" "деталь не важная" "бла-бла-бла"
и меняет описание скопированной строки, получается:
"wu1988" "деталь ОЧЕНЬ важная" "бла-бла-бла"

В итоге, элемент "Узел15" не должен записаться, так, как в нем есть строка с id из из строки другого элемента (записанной строки) и id из строки этого элемента (строки еще не записанной) .

LexaK

ааа, стало  гораздо понятнее
вот попробуйте такой код, только свои наименования подставьте,
вместо ВашСправочник, ВашаТЧ, ИД



Процедура ПередЗаписью(Отказ)
ПроверкаДублей(Отказ);
//дальше ваш код

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

Процедура ПроверкаДублей(Отказ)

//Запрос - шаблон
лкЗапрос = Новый Запрос;
лкЗапрос.Текст = "
    |Выбрать
| Таб.НомерСтроки,
|   Таб.ИД
|Поместить Таб
|Из &Таблица Таб
|;
|//проверка дублирования, в собственной ТЧ
|Выбрать
| Таб.ИД,
| Таб.НомерСтроки,
| ""текущей ТЧ"" как Источник
|Из
|   Таб
|левое соединение Таб Таб2
| по Таб.Ид = Таб2.ИД
| и таб.НомерСтроки <> Таб2.НомерСтроки
|где
|не Таб2.ИД есть Null
|
|Объединить все
|
|//поиск по другим справочникам
|Выбрать
| Таб.ИД,
| Спр.НомерСтроки,
|   Представление(Спр.Ссылка)
|Из
|   Таб
|левое соединение
|   Справочник.ВашСправочник.ВашаТЧ как Спр
| по таб.ИД = Спр.ИД
| и Спр.Ссылка <> &Ссылка
|где
|   Не Спр.Ссылка есть Null
|Упорядочить по
| 1,3,2
|";
лкЗапрос.УстановитьПараметр("Ссылка", Ссылка);
лкЗапрос.УстановитьПараметр("Таблица", ВащаТЧ.Выгрузить());

лкВыборка = лкЗапрос.Выполнить().Выбрать();
Отказ = лкВыборка.Количество()>0;
Пока лкВыборка.Следующий() Цикл
Сообщить("ИД: " + лкВыборка.ИД
+ " дублирование кода в " + лкВыборка.Источник
+ " строка: " + лкВыборка.НомерСтроки
);
КонецЦикла;

КонецПроцедуры
ответ Понравился? (в смысле пригодился?)

oooo800

Спасибо.
Попробую.
Добавлено: 28 авг 2020, 18:18


По первой попытке:

{(27, 5)}: Операция не разрешена в предложении "УПОРЯДОЧИТЬ"
<<?>>Представление(Спр.Ссылка)


Изменено:
|   Справочник.ВашСправочник.ВашаТЧ как Спр
на
|   Справочник.МойСправочник.ТЧСправочника как Спр
и
ИД
на
СуперУникальныйРеквизит
и
лкЗапрос.УстановитьПараметр("Ссылка", ТекущийОбъект.Ссылка);
лкЗапрос.УстановитьПараметр("Таблица", ТекущийОбъект.ТЧСправочника.Выгрузить());


pyrkin_vanya

Почему нельзя использовать реквизит с типом уникальный идентификатор?

Отправлено с моего Redmi Note 7 через Tapatalk


oooo800

Цитата: pyrkin_vanya от 29 авг 2020, 07:16
Почему нельзя использовать реквизит с типом уникальный идентификатор?

К сожалению, тот ... этот реквизит несет большую смысловую нагрузку.
Там должны быть, понятные многим, значения.
А строка вида 39798347893-adeb-378461378, ну что-то типа того, не подойдет.

pyrkin_vanya

Цитата: oooo800 от 29 авг 2020, 10:03
Цитата: pyrkin_vanya от 29 авг 2020, 07:16
Почему нельзя использовать реквизит с типом уникальный идентификатор?

К сожалению, тот ... этот реквизит несет большую смысловую нагрузку.
Там должны быть, понятные многим, значения.
А строка вида 39798347893-adeb-378461378, ну что-то типа того, не подойдет.
В таком случае, я бы использовал принцип формирования идентификатора для формул вида цен из ут 11. И процедуру можно от туда же взять. Просто добавить свои значения помимо наименования.

Отправлено с моего Redmi Note 7 через Tapatalk


oooo800

Цитата: pyrkin_vanya от 29 авг 2020, 10:09
Цитата: oooo800 от 29 авг 2020, 10:03
Цитата: pyrkin_vanya от 29 авг 2020, 07:16
Почему нельзя использовать реквизит с типом уникальный идентификатор?

К сожалению, тот ... этот реквизит несет большую смысловую нагрузку.
Там должны быть, понятные многим, значения.
А строка вида 39798347893-adeb-378461378, ну что-то типа того, не подойдет.
В таком случае, я бы использовал принцип формирования идентификатора для формул вида цен из ут 11. И процедуру можно от туда же взять. Просто добавить свои значения помимо наименования.

Отправлено с моего Redmi Note 7 через Tapatalk

Спасибо.
Вариант LexaK с запросом сработал, за исключением ошибки с Упорядочить.
В запросах пока не силен, как он.


Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск