Проверка на дублирование элемент подчинненного справочника !!!

1. ametist 16.12.08 13:27 Сейчас в теме
Смысл такой:
нужно что бы спец.при внесении элемента в подч.справ. немог внести повторно одну и ту ж запись.с одинаковыми реквизитами.Пробовал с перебором справочника, неполучаеться выбрать значения спр.в ТЗ.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. PeRom 51 16.12.08 13:56 Сейчас в теме
При записи нового или изменённого элемента проверять уникальность нужных элементов.
ВыбратьЭлементыПоРеквизиту() для реквизитов с установленным признаком сортировки или запрос по всем нужным реквизитам с последующим сравнением.
А лучше по Душелову из соседней ветки.
3. ametist 16.12.08 14:52 Сейчас в теме
В общем понятно что проверять на уникальность, но как это будет выглядеть.

Вот мой код модуля ФормыСписка подч.справ.


_ТЗ.ВыбратьСтроки();
Пока _ТЗ.ПолучитьСтроку() = 1 Цикл
НВыдаток=Выдаток;
НМесяцНВ=_ТЗ.МесяцНВ;
НГодНВ=_ТЗ.ГодНВ;
НМесяцКВ=_ТЗ.МесяцКВ;
НГодКВ=_ТЗ.ГодКВ;

НайденнаяСтрока=0;
Если _ТЗ.НайтиЗначение(НВыдаток,НайденнаяСтрока,"Выдаток")=1 Тогда
Если _ТЗ.НайтиЗначение(НМесяцНВ,НайденнаяСтрока,"МесяцНВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НГодНВ,НайденнаяСтрока,"ГодНВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НМесяцКВ,НайденнаяСтрока,"МесяцКВ")=1 Тогда
Если _ТЗ.НайтиЗначение(НГодКВ,НайденнаяСтрока,"ГодКВ")=1 Тогда

Если ТЗ.ПолучитьЗначение(НайденнаяСтрока,"Выдаток")=_ТЗ.Выдаток Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"МесяцНВ")=_ТЗ.МесяцНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"ГодНВ")=_ТЗ.ГодНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"МесяцКВ")=_ТЗ.МесяцНВ Тогда
Если _ТЗ.ПолучитьЗначение(НайденнаяСтрока,"ГодКВ")=_ТЗ.ГодНВ Тогда
Сообщить(мСообщение+"Повторение выдатку: "+СокрП(НВыдаток.Выдаток));
СтатусВозврата(0);
Возврат 0;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;


_ТЗ.НоваяСтрока();
_ТЗ.УстановитьЗначение(_ТЗ.НомерСтроки,"Выдаток",НВыдаток);
КонецЦикла;
Возврат 1;

Пробовал так сначала, но потом выяснилось (методом тыка)что в ТЗ даже не загнать элементы, само собой и проверка не выходила.
Проверку делаю в модуле списка под.справ.
4. Душелов 4017 16.12.08 14:57 Сейчас в теме
Грубо говоря так.

Код
Функция ЕстьДубльНоменклатуры(Номенклатура)
    Выборка = Справочники.Номенклатура.Выбрать();
    Пока Выборка.Следующий Цикл
          Если Выборка.ЭтоГруппа ИЛИ Выборка.ПометкаУдаления Тогда
                 Продолжить;
          КонецЕсли;
  
          Если Выборка.Наименование = Номенклатура.Наименование
                И Выборка.Реквизит1 = Номенклатура.Реквизит1
                ...
                И Выборка.Реквизит10 = Номенклатура.Реквизит10 Тогда
                Возврат Истина;
          КонецЕсли;
      КонецЦикла;
 
      Возврат Ложь;
КонецФункции
Показать полностью
5. ametist 16.12.08 15:05 Сейчас в теме
Посмотри выше во времени немного розошлись
6. Душелов 4017 16.12.08 15:08 Сейчас в теме
В восьмерке также можно выгрузить все в ТЗ и найти строки с использованием структуры отбора.
7. ametist 16.12.08 15:11 Сейчас в теме
8. Душелов 4017 16.12.08 15:27 Сейчас в теме
Функция "НайтиСтроки", смотрите описание в синтаксис-помощнике.
9. Ёпрст 1063 16.12.08 15:29 Сейчас в теме
С справочнике завести служебный реквизит в который вносить составной индекс от совокупности реквизитов + галка сортировка по нему...
При записи достаточно проверить НайтиПоРеквизиту и привет.
10. Душелов 4017 16.12.08 15:32 Сейчас в теме
А если подчиненные, поставить проверку уникальности кодов по всему справочнику, а не в пределах подчинения и код сделать текстовым и его использовать в качестве идентификатора, как и Ёпрст написал.
11. ametist 18.12.08 12:34 Сейчас в теме
Спасибо за советы, но невыходит у меня или я что то не так делаю.Я хочу сделать проверку на дубляж так:
в проц при записи или при открытии написать что бы созд.ТЗ и в нее выгрузить список элементов что есть в подчиненном справ , а потом переборку сделать и вычислять есть дубль или нет.Сейчас никак не получаеться загнать элементы подчинн.справочника в ТЗ.
Постановка задачи такова: есть справ.лицевые счета(рекв. - "ФИО.адрес") в нем подч.справ.(виды мат.помощ- рекв. - "наименов. помощи;начало выпл;конец выплаты;сумма),нужно что бы спец.случайно не внес.помощь которая уже существует.


12. PeRom 51 18.12.08 12:54 Сейчас в теме
Метод результатаЗапроса Выгрузить() не пробовал?
Пример:ТЗзапроса = Запрос.Выполнить().Выгрузить();
ТЗзапроса НЕ нужно создавать или определять заранее, а вот Запрос определить и в Запрос.Текст внести текст запроса(можно сделать конструктором запроса из контекстного меню в модуле).
13. alexk-is 6534 18.12.08 13:31 Сейчас в теме
Может так:
// Заполнение
Создать объект таблица значений
Создать объект справочник
Установить владельца
Перебрать подчиненные элементы справочника в цикле
В этом цикле для каждого элемента справочника добавлять строку в таблицу значений и устанавливать реквизиты

// Проверка
Выгрузить таблицу значений в копию. Только ключевые поля
Добавить в копию колонку, например "КоличествоКопий", и установить в ней значение 1
Свернуть копию таблицы значений по ключевым полям и посчитать сумму в колонке "КоличествоКопий"
Перебрать строки в копии и проверить "КоличествоКопий" > 1
Если условие выполнено, то выдать сообщение об ошибке
14. ametist 18.12.08 13:52 Сейчас в теме
Процедура в модуле подч.справочника
Пробовал вот так как тест,попадут в тз или нет:

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

Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ", "Число", 5, 2, "МесяцНВ", 5, , 1);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);
КонецЦикла;
Конецпроцедуры

не попадают
Нужно выбрать выдатки не всех клиентов, а именно текущего которого редактируют.


15. PeRom 51 18.12.08 14:07 Сейчас в теме
Повеселил: Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ", "Число", 5, 2, "МесяцНВ", 5, , 1);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);
КонецЦикла; Создание колонок в цикле?!?! :)))
ТЗ = СоздатьОбъект(ТаблицаЗначений);
ТЗ.НоваяКолонка("Выдаток","Справочник.ВыдаткиКлиента",,,"Выдаток",,55,1);
.................
Пока ... Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток = ВК. и тд. и будет тебе счастье!
16. ametist 18.12.08 14:18 Сейчас в теме
Запутался немного, да согласен бред написал, вот код другой

ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Выдаток","Справочник.Наименование",,,"Выдаток",,55,1);
ТЗ.НоваяКолонка("МесяцНВ","Строка",2);
ТЗ.НоваяКолонка("ГодНВ","Строка",2);
ТЗ.НоваяКолонка("МесяцКВ","Строка",2);
ТЗ.НоваяКолонка("ГодКВ","Строка",2);


Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток.Наименование;
тд.тп....
КонецЦикла;

неработает всеравно не затягивает
17. alexk-is 6534 18.12.08 14:45 Сейчас в теме
(16)
ТЗ.НоваяКолонка("Выдаток","Справочник",,,"Выдаток",,55,1);

//Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
//С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(Владелец);
24. ametist 18.12.08 18:14 Сейчас в теме
Фууу решил, само решение:

ТЗ.НоваяКолонка("Выдаток",,,,,,,);
ТЗ.НоваяКолонка("МесяцНВ",,,,,,,);

ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
ВК.ИспользоватьВладельца(Владелец);
// Сообщить(ВК);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
Сообщить(+ВК.Выдаток);
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток;
ТЗ.МесяцНВ=ВК.МесяцЧислоП;
КонецЦикла;

на сегодня хватит, завтра перебором займусь.
А (17) было правильно.Всем спасибо большое.
18. PeRom 51 18.12.08 15:22 Сейчас в теме
16.>ТЗ.НоваяСтрока();
>ТЗ.Выдаток=ВК.Выдаток.Наименование; //Здесь .Выдаток.Наименование не нужно, нужно .ТекущийЭлемент().
Если создаёшь колонку с типом "Справочник.ВыдаткиКлиента", то заноси туда ссылку на справочник - ВК.ТекущийЭлемент(), если-же нужно "Наименование" (у Наименования тип строка), тогда и колонку создавай с типом "строка" и заносить туда - ВК.Наименование.
19. ametist 18.12.08 15:43 Сейчас в теме
Вариант "Алексей Константинов" - не проходит
PeRom- уже и так пробовал

Клиент = СоздатьОбъект("Справочник.Клиенты");
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
С = Клиент.ТекущийЭлемент();
ВК.ИспользоватьВладельца(С);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.Выдаток=ВК.Выдаток.ТекущийЭлемент();
КонецЦикла;

ну незнаю впрям что и делать, не затягивает
20. alexk-is 6534 18.12.08 16:22 Сейчас в теме
(19)
Добавь после С = Клиент.ТекущийЭлемент();
Сообщить(С);

Из кода видно, что владелец не определен. В результате подставляется пустая ссылка.
Тебе нужна ссылка на владельца. Или передай ее парамертом или еще как поймай.
ПриСменеВладельца() и/или ПриОткрытии()

ТЗ.Выдаток=ВК.Выдаток.ТекущийЭлемент();
Если "Выдаток" это реквизит справочника, то он уже ссылка. ТекущийЭлемент() - это перебор.
21. ametist 18.12.08 16:32 Сейчас в теме
Алексей Константинов пишет:

(19)
Добавь после С = Клиент.ТекущийЭлемент();
Сообщить(С);

Из кода видно, что владелец не определен. В результате подставляется пустая ссылка.


Да пустая, не оредиляет владельца хм интересно .
22. PeRom 51 18.12.08 16:42 Сейчас в теме
А Клиент - что такое, где определяется? Если по (19) и раньше нигде не определён - то он и будет пустой, нужно спозиционировать на конкретном элементе справочника, типа Выбрать()-Получить(), Найти() и тп.
И
С = Клиент.ТекущийЭлемент(); 
ВК.ИспользоватьВладельца(С); 

можно заменить на
ВК.ИспользоватьВладельца(Клиент); 
23. ametist 18.12.08 17:51 Сейчас в теме
Клиент = СоздатьОбъект("Справочник.Клиенты");
Клиент.ВыбратьЭлементы();
Пока Клиент.ПолучитьЭлемент() = 1 Цикл
ВК = СоздатьОбъект("Справочник.ВыдаткиКлиента");
ВК.ИспользоватьВладельца(Клиент);
ВК.ВыбратьЭлементы();
Пока ВК.ПолучитьЭлемент() = 1 Цикл
Сообщить(+ВК.Выдаток);
КонецЦикла;
КонецЦикла;

так уже выбирает просто все выдатки, но не по конкретному.
25. ineoosaki 18.12.08 19:47 Сейчас в теме
Автору ветки:
Открой типовую ТиС/комплекс/ПУБ, справочник цены. Там нельзя добавить два элемента с одинаковым типом цен. Посмотри как реализовано.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот