Здравствуйте, пытаюсь реализовать контроль уникальности наименования Справочника
Процедура проверяет на дубли и выводит предупреждение, но все равно остается возможность записи В чем ошибка?
Процедура проверяет на дубли и выводит предупреждение, но все равно остается возможность записи В чем ошибка?
Процедура ПередЗаписью(Отказ, Элемент, Источник)
Если ТипЗнч(Наименование) = Тип("Строка") Тогда
Если Ссылка.Наименование <> Наименование Тогда
Н = СправочникОбъект.Наименование;
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Н) = Справочники.ТМЦ.ПустаяСсылка() Тогда
Текст = "ru = ""Справочник не уникален!""";
Предупреждение(НСтр(Текст), 10);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Дерево справочника
- Контроль уникальности элементов справочника по произвольному количеству реквизитов, с использованием "И"
- Задвоились предопределенные элементы справочников? Выход есть!
- Автоматическое исправление ошибки в БД "Проверка уникальности внутреннего идентификатора ..."
- Справочник "Номенклатура": технические характеристики, учет аналогов, контроль уникальности и многое другое…
Найденные решения
(33) Оказывается если сделать так, то все сработает:
Всем спасибо за участие в теме
Процедура ПередЗаписью(Отказ,)
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Наименование) = Справочники.ТМЦ.ПустаяСсылка() Тогда
Текст = "ru = ""Наименование записи справочника не уникально!""";
Предупреждение(НСтр(Текст), 10);
Отказ = Истина;
ЭтаФорма.Закрыть(Отказ);
Возврат;
КонецЕсли;
КонецПроцедуры
ПоказатьВсем спасибо за участие в теме
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) В смысле "остается возможность записи"?
Если предупреждение выдало, то форма должна остаться открытой, а изменения не записанными (форма со звездочкой в заголовке).
При повторной попытке должно быть то же самое - выдать предупреждение и не записать.
А у вас что происходит?
Если предупреждение выдало, то форма должна остаться открытой, а изменения не записанными (форма со звездочкой в заголовке).
При повторной попытке должно быть то же самое - выдать предупреждение и не записать.
А у вас что происходит?
(1)
попробуй так
Процедура ПередЗаписью(Отказ, Элемент, Источник)
Если ОбменДанными.Загрузка = Истина Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Наименование) = Тип("Строка") Тогда
Если Ссылка.Наименование <> Наименование Тогда
Н = СправочникОбъект.Наименование;
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Н) = Справочники.ТМЦ.ПустаяСсылка() Тогда
Текст = "ru = ""Справочник не уникален!""";
Предупреждение(НСтр(Текст), 10);
Отказ = Истина;
//Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показатьпопробуй так
Меня смущает обращение к наименованию через СправочникОбъект. Пока не понимаю, как это может влиять, но давайте для начала упростим код и искать будем по полному совпадению:
Процедура ПередЗаписью(Отказ, Элемент, Источник)
Если ЗначениеЗаполнено(Справочники.ТМЦ.НайтиПоНаименованию(Наименование, Истина)) Тогда
Отказ = Истина;
Предупреждение(НСтр("ru = ""Справочник не уникален!"""), 10);
КонецЕсли;
КонецПроцедуры
(21) По большому счету Справочник.Объект не влияет, можно сказать - это мои жалкие попытки реализовать процедуру, реквизитов нет, к примеру если все заменить на код как в (15) - обрабатывает с такой же проблемой. Справочник "толькочто" созданный. Вопрос почему код, грубо говоря игнорит, "Отказ = Истина"
Короче, вот это должно работать как надо:
Процедура ПередЗаписью(Отказ, Элемент, Источник)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка <> &Ссылка
| И Номенклатура.Наименование = &Наименование";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Наименование", СправочникОбъект.Наименование);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Сообщить("В базе уже есть элемент с указанным наименованием", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Показать
(25) но если учесть ваше замечание и оптимизировать то можно вот так:
Процедура ПередЗаписью(Отказ, Элемент, Источник)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| И Номенклатура.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", СправочникОбъект.Наименование);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если Выборка.Ссылка=Ссылка Тогда
Возврат;
КонецЕсли;
Сообщить("В базе уже есть элемент с указанным наименованием", СтатусСообщения.Важное);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Показать
Вот так вот:
Процедура ПередЗаписью(Отказ, Элемент, Источник)
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Объект.Наименование) = Справочники.ТМЦ.ПустаяСсылка() Тогда
Текст = "ru = ""Наименование записи справочника не уникально!""";
Предупреждение(НСтр(Текст), 10);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
То есть вот так вот прям точно всё станет срабатывать:
Процедура ПередЗаписью(Отказ, Элемент, Источник)
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Объект.Наименование) = Справочники.ТМЦ.ПустаяСсылка() Тогда
Текст = "ru = ""Наименование записи справочника не уникально!""";
Предупреждение(НСтр(Текст), 10);
Отказ = Истина;
ЭтаФорма.Закрыть(Отказ);
Возврат;
КонецЕсли;
КонецПроцедуры
Показать
(33) этот проверка только для новых корректна?
а что будет, если изменить не наименование, а другой реквизит. запишется?
(1) если sql, то я б решил все на стороне скуля созданием уникального индекса (первичного ключа) и без единой строки кода на стороне 1с. хотя это конечно не тру программирование, потом лицензии и все такое...
а что будет, если изменить не наименование, а другой реквизит. запишется?
(1) если sql, то я б решил все на стороне скуля созданием уникального индекса (первичного ключа) и без единой строки кода на стороне 1с. хотя это конечно не тру программирование, потом лицензии и все такое...
(33) Тогда вываливается вот это :
Если убрать - не дает вообще возможность записи, даже с именем которое не используется
Значение не является значением объектного типа (Наименование)
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Объект.Наименование) = Справочники.ТМЦ.ПустаяСсылка() Тогда
Если убрать - не дает вообще возможность записи, даже с именем которое не используется
(47) Раз ругается на Объект, значит он у Вас, видимо, типа "Управляемая форма", а не элемент справочника. К сожалению, сведений о конфигурации и варианте приложения Вы не предоставили, догадаться по коду не получается :-) Используйте "ЭтотОбъект", вместо "Объект".
(33) Оказывается если сделать так, то все сработает:
Всем спасибо за участие в теме
Процедура ПередЗаписью(Отказ,)
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Наименование) = Справочники.ТМЦ.ПустаяСсылка() Тогда
Текст = "ru = ""Наименование записи справочника не уникально!""";
Предупреждение(НСтр(Текст), 10);
Отказ = Истина;
ЭтаФорма.Закрыть(Отказ);
Возврат;
КонецЕсли;
КонецПроцедуры
ПоказатьВсем спасибо за участие в теме
Капец :-) А вы не хотите проверить объект на новый?
Короче
(14)
(15)
(23)
Короче
Процедура ПередЗаписью(Отказ, Элемент, Источник)
Если ЭтоНовый() Тогда // Для УФ Если Не Параметры.Ключ.Пустая() Тогда
Если Не Справочники.ТМЦ.НайтиПоНаименованию(Объект.Наименование) .Пустая() Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры;
Показать(14)
(15)
(23)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот