Проверка на дублирование элемент подчинненного справочника !!!
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
При записи нового или изменённого элемента проверять уникальность нужных элементов.
ВыбратьЭлементыПоРеквизиту() для реквизитов с установленным признаком сортировки или запрос по всем нужным реквизитам с последующим сравнением.
А лучше по Душелову из соседней ветки.
ВыбратьЭлементыПоРеквизиту() для реквизитов с установленным признаком сортировки или запрос по всем нужным реквизитам с последующим сравнением.
А лучше по Душелову из соседней ветки.
В общем понятно что проверять на уникальность, но как это будет выглядеть.
Вот мой код модуля ФормыСписка подч.справ.
_ТЗ.ВыбратьСтроки();
Пока _ТЗ.ПолучитьСтроку() = 1 Цикл
НВыдаток=Выдаток;
НМесяцНВ=_ТЗ.МесяцНВ;
НГодНВ=_ТЗ.ГодНВ;
НМесяцКВ=_ТЗ.МесяцКВ;
НГодКВ=_ТЗ.ГодКВ;
НайденнаяСтрока=0;
Если _ТЗ.НайтиЗначение(НВыдаток,НайденнаяСтрока,"Выдаток")=1 Тогда
Если _ТЗ.НайтиЗначение(НМесяцНВ,НайденнаяСтрока,"МесяцНВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НГодНВ,НайденнаяСтрока,"ГодНВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НМесяцКВ,НайденнаяСтрока,"МесяцКВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НГодКВ,НайденнаяСтрока,"ГодКВ")=1 Тогда
Если ТЗ.ПолучитьЗначение(НайденнаяСтрока,"Выдаток")=_ТЗ.Выдаток Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"МесяцНВ")=_ТЗ.МесяцНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"ГодНВ")=_ТЗ.ГодНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"МесяцКВ")=_ТЗ.МесяцНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"ГодКВ")=_ТЗ.ГодНВ Тогда
Сообщить(мСообщение+"Повторение выдатку: "+СокрП(НВыдаток.Выдаток));
СтатусВозврата(0);
Возврат 0;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
_ТЗ.НоваяСтрока();
_ТЗ.УстановитьЗначение(_ТЗ.НомерСтроки,"Выдаток",НВыдаток);
КонецЦикла;
Возврат 1;
Пробовал так сначала, но потом выяснилось (методом тыка)что в ТЗ даже не загнать элементы, само собой и проверка не выходила.
Проверку делаю в модуле списка под.справ.
Вот мой код модуля ФормыСписка подч.справ.
_ТЗ.ВыбратьСтроки();
Пока _ТЗ.ПолучитьСтроку() = 1 Цикл
НВыдаток=Выдаток;
НМесяцНВ=_ТЗ.МесяцНВ;
НГодНВ=_ТЗ.ГодНВ;
НМесяцКВ=_ТЗ.МесяцКВ;
НГодКВ=_ТЗ.ГодКВ;
НайденнаяСтрока=0;
Если _ТЗ.НайтиЗначение(НВыдаток,НайденнаяСтрока,"Выдаток")=1 Тогда
Если _ТЗ.НайтиЗначение(НМесяцНВ,НайденнаяСтрока,"МесяцНВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НГодНВ,НайденнаяСтрока,"ГодНВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НМесяцКВ,НайденнаяСтрока,"МесяцКВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НГодКВ,НайденнаяСтрока,"ГодКВ")=1 Тогда
Если ТЗ.ПолучитьЗначение(НайденнаяСтрока,"Выдаток")=_ТЗ.Выдаток Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"МесяцНВ")=_ТЗ.МесяцНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"ГодНВ")=_ТЗ.ГодНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"МесяцКВ")=_ТЗ.МесяцНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"ГодКВ")=_ТЗ.ГодНВ Тогда
Сообщить(мСообщение+"Повторение выдатку: "+СокрП(НВыдаток.Выдаток));
СтатусВозврата(0);
Возврат 0;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
_ТЗ.НоваяСтрока();
_ТЗ.УстановитьЗначение(_ТЗ.НомерСтроки,"Выдаток",НВыдаток);
КонецЦикла;
Возврат 1;
Пробовал так сначала, но потом выяснилось (методом тыка)что в ТЗ даже не загнать элементы, само собой и проверка не выходила.
Проверку делаю в модуле списка под.справ.
Грубо говоря так.
Код |
---|
Функция ЕстьДубльНоменклатуры(Номенклатура)
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий Цикл
Если Выборка.ЭтоГруппа ИЛИ Выборка.ПометкаУдаления Тогда
Продолжить;
КонецЕсли;
Если Выборка.Наименование = Номенклатура.Наименование
И Выборка.Реквизит1 = Номенклатура.Реквизит1
...
И Выборка.Реквизит10 = Номенклатура.Реквизит10 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Показать полностью |
Спасибо за советы, но невыходит у меня или я что то не так делаю.Я хочу сделать проверку на дубляж так:
в проц при записи или при открытии написать что бы созд.ТЗ и в нее выгрузить список элементов что есть в подчиненном справ , а потом переборку сделать и вычислять есть дубль или нет.Сейчас никак не получаеться загнать элементы подчинн.справочника в ТЗ.
Постановка задачи такова: есть справ.лицевые счета(рекв. - "ФИО.адрес") в нем подч.справ.(виды мат.помощ- рекв. - "наименов. помощи;начало выпл;конец выплаты;сумма),нужно что бы спец.случайно не внес.помощь которая уже существует.
в проц при записи или при открытии написать что бы созд.ТЗ и в нее выгрузить список элементов что есть в подчиненном справ , а потом переборку сделать и вычислять есть дубль или нет.Сейчас никак не получаеться загнать элементы подчинн.справочника в ТЗ.
Постановка задачи такова: есть справ.лицевые счета(рекв. - "ФИО.адрес") в нем подч.справ.(виды мат.помощ- рекв. - "наименов. помощи;начало выпл;конец выплаты;сумма),нужно что бы спец.случайно не внес.помощь которая уже существует.
Метод результатаЗапроса Выгрузить() не пробовал?
Пример:ТЗзапроса = Запрос.Выполнить().Выгрузить();
ТЗзапроса НЕ нужно создавать или определять заранее, а вот Запрос определить и в Запрос.Текст внести текст запроса(можно сделать конструктором запроса из контекстного меню в модуле).
Пример:ТЗзапроса = Запрос.Выполнить().Выгрузить();
ТЗзапроса НЕ нужно создавать или определять заранее, а вот Запрос определить и в Запрос.Текст внести текст запроса(можно сделать конструктором запроса из контекстного меню в модуле).
Может так:
// Заполнение
Создать объект таблица значений
Создать объект справочник
Установить владельца
Перебрать подчиненные элементы справочника в цикле
В этом цикле для каждого элемента справочника добавлять строку в таблицу значений и устанавливать реквизиты
// Проверка
Выгрузить таблицу значений в копию. Только ключевые поля
Добавить в копию колонку, например "КоличествоКопий", и установить в ней значение 1
Свернуть копию таблицы значений по ключевым полям и посчитать сумму в колонке "КоличествоКопий"
Перебрать строки в копии и проверить "КоличествоКопий" > 1
Если условие выполнено, то выдать сообщение об ошибке
// Заполнение
Создать объект таблица значений
Создать объект справочник
Установить владельца
Перебрать подчиненные элементы справочника в цикле
В этом цикле для каждого элемента справочника добавлять строку в таблицу значений и устанавливать реквизиты
// Проверка
Выгрузить таблицу значений в копию. Только ключевые поля
Добавить в копию колонку, например "КоличествоКопий", и установить в ней значение 1
Свернуть копию таблицы значений по ключевым полям и посчитать сумму в колонке "КоличествоКопий"
Перебрать строки в копии и проверить "КоличествоКопий" > 1
Если условие выполнено, то выдать сообщение об ошибке
Процедура в модуле подч.справочника
Пробовал вот так как тест,попадут в тз или нет:
Процедура ПроверкаДублейСтрок()
Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ", "Число", 5, 2, "МесяцНВ", 5, , 1);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);
КонецЦикла;
Конецпроцедуры
не попадают
Нужно выбрать выдатки не всех клиентов, а именно текущего которого редактируют.
Пробовал вот так как тест,попадут в тз или нет:
Процедура ПроверкаДублейСтрок()
Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ", "Число", 5, 2, "МесяцНВ", 5, , 1);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);
КонецЦикла;
Конецпроцедуры
не попадают
Нужно выбрать выдатки не всех клиентов, а именно текущего которого редактируют.
Повеселил: Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ", "Число", 5, 2, "МесяцНВ", 5, , 1);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);
КонецЦикла; Создание колонок в цикле?!?! :)))
ТЗ = СоздатьОбъект(ТаблицаЗначений);
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
.................
Пока ... Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток = ВК. и тд. и будет тебе счастье!
ТЗ.НоваяСтрока();
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ", "Число", 5, 2, "МесяцНВ", 5, , 1);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);
КонецЦикла; Создание колонок в цикле?!?! :)))
ТЗ = СоздатьОбъект(ТаблицаЗначений);
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
.................
Пока ... Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток = ВК. и тд. и будет тебе счастье!
Запутался немного, да согласен бред написал, вот код другой
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Выдаток","Справочник.Наименование",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ","Строка",2);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);
Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток.Наименование;
тд.тп....
КонецЦикла;
неработает всеравно не затягивает
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Выдаток","Справочник.Наименование",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ","Строка",2);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);
Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток.Наименование;
тд.тп....
КонецЦикла;
неработает всеравно не затягивает
Фууу решил, само решение:
ТЗ.НоваяКолонка("Выдаток",,,,,,,);
ТЗ.НоваяКолонка("МесяцНВ",,,,,,,);
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
ВК.ИспользоватьВладельца(Владелец);
// Сообщить(ВК);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
Сообщить(+ВК.Выдаток);
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток;
ТЗ.МесяцНВ=ВК.МесяцЧислоП;
КонецЦикла;
на сегодня хватит, завтра перебором займусь.
А (17) было правильно.Всем спасибо большое.
ТЗ.НоваяКолонка("Выдаток",,,,,,,);
ТЗ.НоваяКолонка("МесяцНВ",,,,,,,);
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
ВК.ИспользоватьВладельца(Владелец);
// Сообщить(ВК);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
Сообщить(+ВК.Выдаток);
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток;
ТЗ.МесяцНВ=ВК.МесяцЧислоП;
КонецЦикла;
на сегодня хватит, завтра перебором займусь.
А (17) было правильно.Всем спасибо большое.
16.>ТЗ.НоваяСтрока();
>ТЗ.Выдаток=ВК.Выдаток.Наименование; //Здесь .Выдаток.Наименование не нужно, нужно .ТекущийЭлемент().
Если создаёшь колонку с типом "Справочник.ВыдаткиКлиента", то заноси туда ссылку на справочник - ВК.ТекущийЭлемент(), если-же нужно "Наименование" (у Наименования тип строка), тогда и колонку создавай с типом "строка" и заносить туда - ВК.Наименование.
>ТЗ.Выдаток=ВК.Выдаток.Наименование; //Здесь .Выдаток.Наименование не нужно, нужно .ТекущийЭлемент().
Если создаёшь колонку с типом "Справочник.ВыдаткиКлиента", то заноси туда ссылку на справочник - ВК.ТекущийЭлемент(), если-же нужно "Наименование" (у Наименования тип строка), тогда и колонку создавай с типом "строка" и заносить туда - ВК.Наименование.
Вариант "Алексей Константинов" - не проходит
PeRom- уже и так пробовал
Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток.ТекущийЭлемент();
КонецЦикла;
ну незнаю впрям что и делать, не затягивает
PeRom- уже и так пробовал
Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток.ТекущийЭлемент();
КонецЦикла;
ну незнаю впрям что и делать, не затягивает
(19)
Добавь после С = Клиент.ТекущийЭлемент();
Сообщить(С);
Из кода видно, что владелец не определен. В результате подставляется пустая ссылка.
Тебе нужна ссылка на владельца. Или передай ее парамертом или еще как поймай.
ПриСменеВладельца() и/или ПриОткрытии()
ТЗ.Выдаток=ВК.Выдаток.ТекущийЭлемент();
Если "Выдаток" это реквизит справочника, то он уже ссылка. ТекущийЭлемент() - это перебор.
Добавь после С = Клиент.ТекущийЭлемент();
Сообщить(С);
Из кода видно, что владелец не определен. В результате подставляется пустая ссылка.
Тебе нужна ссылка на владельца. Или передай ее парамертом или еще как поймай.
ПриСменеВладельца() и/или ПриОткрытии()
ТЗ.Выдаток=ВК.Выдаток.ТекущийЭлемент();
Если "Выдаток" это реквизит справочника, то он уже ссылка. ТекущийЭлемент() - это перебор.
Алексей Константинов пишет:
(19)
Добавь после С = Клиент.ТекущийЭлемент();
Сообщить(С);
Из кода видно, что владелец не определен. В результате подставляется пустая ссылка.
(19)
Добавь после С = Клиент.ТекущийЭлемент();
Сообщить(С);
Из кода видно, что владелец не определен. В результате подставляется пустая ссылка.
Да пустая, не оредиляет владельца хм интересно .
А Клиент - что такое, где определяется? Если по (19) и раньше нигде не определён - то он и будет пустой, нужно спозиционировать на конкретном элементе справочника, типа Выбрать()-Получить(), Найти() и тп.
И
можно заменить на
И
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
можно заменить на
ВК.ИспользоватьВладельца(Клиент);
Клиент = СоздатьОбъект("Справочник.Клиенты");
Клиент.ВыбратьЭлементы();
Пока Клиент.ПолучитьЭлемент() = 1 Цикл
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
ВК.ИспользоватьВладельца(Клиент);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
Сообщить(+ВК.Выдаток);
КонецЦикла;
КонецЦикла;
так уже выбирает просто все выдатки, но не по конкретному.
Клиент.ВыбратьЭлементы();
Пока Клиент.ПолучитьЭлемент() = 1 Цикл
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
ВК.ИспользоватьВладельца(Клиент);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
Сообщить(+ВК.Выдаток);
КонецЦикла;
КонецЦикла;
так уже выбирает просто все выдатки, но не по конкретному.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот