Имя: Пароль:
1C
 
Создание номенклатуры в конечной группе
0 Doroheart
 
03.03.20
12:31
Добрый день, подскажите как можно ограничить создание номенклатуры в корне и разрешить только в конечной папке?
http://prntscr.com/ras4qa
1 dka80
 
03.03.20
12:34
перед записью делаешь проверку на наличие групп в текущем родителе. Если есть группы, тогда отказ=истина
2 vova1122
 
03.03.20
13:08
Лучше проверять ПередОткрытием. А то чел пол часа трудился: заполнял реквизиты елемента справочника, а в конце ему такой облом сообщит система. А для програмной записи можно дополнительно проверить и ПередЗаписюю в модуле документа
3 Doroheart
 
03.03.20
13:10
(2) я планирую проверять "ПередНачаломДобавления", но пока не додумался как сделать проверку на наличии групп в текущем родителе.
4 Doroheart
 
03.03.20
13:14
(1) есть примеры?
5 arsik
 
гуру
03.03.20
13:17
ВЫБРАТЬ ПЕРВЫЕ 1
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа
    И Номенклатура.Родитель = &Родитель
6 vova1122
 
03.03.20
13:29
Если Родитель=Справочники.Контрагенты.ПустаяСсылка() тогда
    Отказ=Истина;
Иначе
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенты.Ссылка
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенти
    |ГДЕ
    |    Контрагенты.Родитель = &Група
    |    И Контрагенты.ЭтоГруппа = Истина";
    
    Запрос.УстановитьПараметр("Група", Родитель);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Всего = РезультатЗапроса.Выбрать().Количество();
    
    Если Всего>0 тогда
        Отказ=Истина;
    КонецЕсли;
КонецЕсли;
7 Doroheart
 
03.03.20
13:50
Нашел вот такой вот запросец

    
    ВсеПапки = Новый Массив;
    
    Запрос = Новый Запрос("ВЫБРАТЬ
    | Номенклатура.Родитель,
    | Номенклатура.Родитель.Родитель,
    | Номенклатура.Родитель.Родитель.Родитель,
    | Номенклатура.Родитель.Родитель.Родитель.Родитель,
    | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель,
    | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
    | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
    | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |
    |ГДЕ
    | Номенклатура.Ссылка = &НоменклатураСсылка");
    
    Пока Истина Цикл
        Запрос.УстановитьПараметр("НоменклатураСсылка", НоменклатураСсылка);
        Результат = Запрос.Выполнить();
        Если Результат.Пустой() Тогда
            Прервать;
        КонецЕсли;
        ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка();
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
            ТекущийЭлементНоменклатуры = Выборка[НомерКолонки];
            Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
                Прервать;
            Иначе
                ВсеПапки.Вставить(0, ТекущийЭлементНоменклатуры);
            КонецЕсли;
        КонецЦикла;
        Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;    
    
    Возврат ВсеПапки;
8 catena
 
03.03.20
13:59
(7)Это получение вышестоящих родителей, а вам нужно проверить наличие хотя бы одного нижестоящего.
9 vova1122
 
03.03.20
14:03
(7) я же написал рабочий вариант (просто замени в нем Контрагенты на Номенклатура)
10 arsik
 
гуру
03.03.20
14:05
(9) У тебя медленный вариант. Вариант в 5 идеальный. Ну и проверять нужно на Запрос.Выполнить().Пустой()
11 Doroheart
 
03.03.20
14:08
(9) я увидел, спасибо) У (5) более оптимизированный вариант поэтому решил его запрос взять
12 НЕА123
 
03.03.20
15:06
ВЫБРАТЬ ПЕРВЫЕ 1 1
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа
    И Номенклатура.Родитель = &Родитель
.....
Запрос.Выполнить().Пустой()
13 vova1122
 
03.03.20
15:13
(11) ну и не забудь добавить как я писал
Если Родитель=Справочники.Номенклатура.ПустаяСсылка() тогда
    Отказ=Истина;

Так как если это не написать то будет возможность создавать товары в кореневой группе
14 Doroheart
 
04.03.20
14:49
В общем выкладываю уже готовый рабочий вариант.


Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |Где
    |   Номенклатура.ЭтоГруппа
    |И     Номенклатура.Родитель = &Родитель";
    Запрос.УстановитьПараметр("Родитель", Родитель);
    РезультатЗапроса = Запрос.Выполнить();
    Всего = РезультатЗапроса.Выбрать().Количество();
    Если Всего>0 И НЕ ЭтоГруппа Тогда
        Отказ = Истина;
        Предупреждение("Номенклатуру можно создавать только в конечной группе!");
    ИначеЕсли НЕ Копирование И НЕ ЭтоГруппа Тогда
        Отказ= Истина;
        ФормаМастер = Справочники.Номенклатура.ПолучитьФорму("МастерВвода");
        ФормаМастер.Родитель = Родитель;
        ФормаМастер.Открыть();    
    КонецЕсли;
15 arsik
 
гуру
04.03.20
15:58
Тебе же сказали, используй метод Пустой()

    РезультатЗапроса = Запрос.Выполнить();
    Всего = РезультатЗапроса.Выбрать().Количество();
    Если Всего>0 И НЕ ЭтоГруппа Тогда

заменить на

    Если не Запрос.Выполнить().Пустой() Тогда

И условия ЭтоГруппа и Копирование нужно проверять до запроса. Зачем лишние обращения к базе.