Имя: Пароль:
1C
1С v8
Проверка циклом определённых данных.
,
0 Godunov
 
22.06.16
14:26
Приветствую всех и прошу совета у спецов, сам новичок в 1С, некоторых моментов не знаю.
Дано 1С 8.2 УТ 10.3
Когда сотрудник формирует из заказов покупателя счёт на оплату покупателю или реализацию товаров и услуг, нужно получить структуру подчиненности документа и по ней пройти циклом и проверить "Если в заказах есть разница в способах или адресе доставки – то выдавать оповещение «В ЗАКАЗАХ УКАЗАН РАЗНЫЙ СПОСОБ/АДРЕС ДОСТАВКИ!»"

http://savepic.ru/10215959.png
http://savepic.ru/10208791.png

В конфигураторе открыл Реализацию товаров и услуг (форму списка) в ней нашёл окно «Структура подчинённости документа», в её коде прописал такой код с циклом:

Процедура ДействияФормыСтруктураПодчиненностиДокумента(Кнопка)
    
    Если ЭлементыФормы.Список.ТекущиеДанные = Неопределено тогда
        Возврат
    КонецЕсли;
    
    РаботаСДиалогами.ПоказатьСтруктуруПодчиненностиДокумента(ЭтаФорма.ЭлементыФормы.Список.ТекущаяСтрока);
    
    Для каждого АдресДоставки из ЗаказПокупателя Цикл
        Если АдресДоставки <> АдресДоставки Тогда
            Сообщить ("Адрес доставки не совпадает в заказах.");
            КонецЕсли;
    КонецЦикла;
КонецПроцедуры

http://savepic.ru/10204695.png

Выдаёт ошибку:
{Документ.РеализацияТоваровУслуг.Форма.ФормаСписка.Форма(38)}: Итератор для значения не определен
    Для каждого АдресДоставки из ЗаказПокупателя Цикл

С циклами мало знаком, можете подсказать, куда копать?
1 Dark_Warrior
 
22.06.16
14:29
А ЗаказПокупателя какой тип имеет?
2 Nuobu
 
22.06.16
14:29
Копать в сторону запросов - критерии отбора.
Ну и ЖКК почитать.
3 ovrfox
 
22.06.16
14:35
Тебе нужно перебрать коллекцию. содержащую заказы.
Насколько я понимаю - это строки документа расходная накладная, видимо таблицная часть "Товары"
Тогда цикл будет

    ТекАдрес = Неопределено;
    Для каждого Стр из ЭтаФорма.Товары Цикл
        Если ТекАдрес = Неопределено Тогда
             ТекАдрес = Стр.Заказ.АдресДоставки
        ИначеЕсли ТекАдрес <> Стр.Заказ.АдресДоставки Тогда
            Сообщить ("Адрес доставки не совпадает в заказах.");
            КонецЕсли;
    КонецЦикла;
4 Godunov
 
22.06.16
14:35
(1) Где это глянуть, ибо новичок...? (2) Что такое ЖКК?
5 Godunov
 
22.06.16
14:38
Дополню инфу, код прописывал так.
http://savepic.ru/10219048.png
6 Nuobu
 
22.06.16
14:38
(4) ЖКК = желто-красные книжки.
по поводу (1) глянь в отладчике.

Тебе нужно наваять запрос, что-то вроде этого:
"ВЫБРАТЬ
    СвязанныеДокументы.Ссылка
ИЗ
    КритерийОтбора.СвязанныеДокументы(&ЗаказПокупателя) КАК СвязанныеДокументы",

Передать туда заказПокупателя.
А потом проверять.
7 Godunov
 
22.06.16
14:41
(6) Вотоночо... Попробую...
8 Godunov
 
22.06.16
14:49
(1) Тип значения: ДокументОбъект.ЗаказПокупателя - оно?
9 Dark_Warrior
 
22.06.16
14:53
(8) Оно. Вы пытаетесь цикл запустить по одному конкретному документу, а не по коллекции.
Ну в конструкция "Если АдресДоставки <> АдресДоставки" сравниваете АдресДоставки  сам с собой.
10 Михаил Козлов
 
22.06.16
14:54
(6) И еще пройтись по связанным документам для связанных документов и т.д.
(0) А если структуру подчиненности не будут смотреть, то и сообщать не нужно?
11 Godunov
 
22.06.16
14:57
(10) Если смотреть не будут, то сообщать всё равно нужно.
12 Nuobu
 
22.06.16
14:57
(11) В какой момент?
13 Godunov
 
22.06.16
14:57
(9) Понял.
14 Godunov
 
22.06.16
15:01
(3) Выяснилось, что не товары.

{Документ.РеализацияТоваровУслуг.Форма.ФормаСписка.Форма(39)}: Поле объекта не обнаружено (Товары)
    Для каждого Стр из ЭтаФорма.Товары Цикл
15 Dark_Warrior
 
22.06.16
15:11
(11) Тогда процедура ДействияФормыСтруктураПодчиненностиДокумента(Кнопка) не подойдет. Она сработает только при нажатии соответствующей кнопки. Смотрите в сторону обработки проведения или записи.
16 Nuobu
 
22.06.16
15:12
(15) + или создания на основании.
17 Godunov
 
22.06.16
15:15
(15) (16) Я в неожиданности, растерянности от ваших мыслей))
Для начала думаю надо сделать, чтобы смотрели структуру, соответственно сообщалось.
Озадачен запросом...
18 Dark_Warrior
 
22.06.16
16:01
(17) Так в (11) Вы же сказали что в любом случае сообщать нужно.
19 Dark_Warrior
 
22.06.16
16:05
+ (18) Более наглядно будет если сделаете подобную проверку при проведении, с отказом в случае несоответствия адресов. Вряд ли пользователи буду заходить в структуру подчиненности для этого, скорее просто забьют.
20 Godunov
 
22.06.16
16:07
(18) Показали на примере мне, что открывают структуру и видят несколько заказов, а в них разные адреса доставки либо пустые строки, вот их и надо проверять.
21 hhhh
 
22.06.16
16:37
(20) ну то есть берете таб часть товары документа реализации, из нее выбираете заказы. Потом у этих заказов смотрите адрес доставки, чтобы был одинаковый.
22 Godunov
 
22.06.16
16:46
(21) На словах и по логике да, я с кодом пока не разберусь...
Тяжко, новичок потому что...
23 hhhh
 
22.06.16
17:03
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
    КОЛИЧЕСТВО РАЗЛИЧНЫЕ (РеализацияТовары.ЗаказПокупателя.АдресДоставки) КАК КоличествоАдресов
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ РеализацияТовары.Ссылка = &Ссылка   ";

Запрос.УстановитьПараметр("Ссылка", ЭлементыФормы.Список.ТекущиеДанные);
24 ovrfox
 
23.06.16
09:13
(14) (23)
Посмотри в конфигураторе, как называется табличная часть документа "Реализация.." и используй ее.
Запросом  будет явно быстрее
Для информации:Если результат запроса КоличествоАдресов =0 значит ничего не найдено, КоличествоАдресов = 1 Все хорошо, КоличествоАдресов >1 Значит адреса разные.
25 Godunov
 
23.06.16
09:28
(24) Хорошо, гляну.
26 Godunov
 
23.06.16
12:06
(3) (24) Пасиб за код, разобрался немного, я его подставлял в форму списка, а надо было в форму документа подставлять, так заработал.

ТекАдрес = Неопределено;
    Для каждого Стр из ЭтаФорма.Товары Цикл
        Если ТекАдрес = Неопределено Тогда
             ТекАдрес = Стр.ЗаказПокупателя.АдресДоставки
        ИначеЕсли ТекАдрес <> Стр.ЗаказПокупателя.АдресДоставки Тогда
            Сообщить ("Адрес доставки не совпадает в заказах.");
            КонецЕсли;
    КонецЦикла;


Попробую запросом порешать.
27 Godunov
 
23.06.16
16:16
Вроде пока с циклом работа устраивает.
Далее возник вопрос, как окна с предупреждением вывести в одно общее и в нём указать ссылки на заказы?
На данный момент так выскакивают окна предупреждения по очереди.
http://savepic.ru/10224113.png
28 Nuobu
 
23.06.16
16:22
(27) Написать своё окно с предупреждением.
29 jyupiter
 
24.06.16
11:24
(27) Выводить предупреждения в табличный документ, в расшифровку ячейки ставить ссылку на заказ
30 Godunov
 
24.06.16
15:54
(29) Как это сделать?)
31 jyupiter
 
27.06.16
05:08
(30) Для начала просто почитать, как выводится информация в табличный документ, посмотреть примеры. Хотя бы в Синтакс-Помощнике по методу Вывести() для Табличного документа.

Там в том числе есть и вывод информации в цикле.

Вероятно, в ходе этого ответы на вопрос найдутся сами собой.
32 Godunov
 
27.06.16
09:57
(31) Пасиб, гляну.
33 Godunov
 
29.06.16
10:51
Забыл отписаться.
С таким кодом получаю нужный мне результат, внешний вид который одобрили.

    Если    ТекАдрес = Неопределено Тогда
        Для каждого Стр из ЭтаФорма.Товары Цикл
             Если ТекАдрес = Неопределено Тогда
                 ТекАдрес = Стр.ЗаказПокупателя.АдресДоставки;
             ИначеЕсли ТекАдрес <> Стр.ЗаказПокупателя.АдресДоставки Тогда
                 Сообщить ("Адрес доставки не совпадает в заказах." + Стр.ЗаказПокупателя.Номер);
             КонецЕсли;
        КонецЦикла;
        
        ВариантДоставки = Неопределено;
        Для каждого Стр из ЭтаФорма.Товары Цикл
            Если ВариантДоставки = Неопределено Тогда
                 ВариантДоставки = Стр.ЗаказПокупателя.ВариантДоставки
            ИначеЕсли ВариантДоставки <> Стр.ЗаказПокупателя.ВариантДоставки Тогда
                Сообщить ("Вариант доставки не совпадает в заказах." + Стр.ЗаказПокупателя.Номер);
            КонецЕсли;
        КонецЦикла;
         
        ОплатаДоставкиПокупателем = Неопределено;
        Для каждого Стр из ЭтаФорма.Товары Цикл
            Если ОплатаДоставкиПокупателем = Неопределено Тогда
                 ОплатаДоставкиПокупателем = Стр.ЗаказПокупателя.ОплатаДоставкиПокупателем
            ИначеЕсли ОплатаДоставкиПокупателем <> Стр.ЗаказПокупателя.ОплатаДоставкиПокупателем Тогда
                Сообщить ("Оплата доставки покупателем не совпадает в заказах." + Стр.ЗаказПокупателя.Номер);
            КонецЕсли;
        КонецЦикла;
        
    Предупреждение ("Данные по доставке не совпадают в заказах.")
    
    КонецЕсли;


http://savepic.ru/10306857.png
34 Godunov
 
29.06.16
10:52
Благодарю за помощь всех.
35 ovrfox
 
29.06.16
11:09
Код не совсем правильный, т.к. не учитывает , что реквизиты могут быть не заполнены (т.е. равняться Неопределено).
И было бы логичнее объединить все проверки в один цикл
36 Godunov
 
29.06.16
11:38
Мне тут сказали что надо переделать...
Лучше не перебирать все строки с товарами, а сначала выгрузить строки в таблицу значений (см. функцию Выгрузить), а далее свернуть таблицу (функция Свернуть) и перебрать эту таблицу.
Изучаю эти функции...
Может кто сталкивался, можете подсказать, как лучше написать код?
37 Godunov
 
05.07.16
11:41
Решил свой вопрос, код такой. Всем пасиба)

    
    ТаблЗнач = ЭтаФорма.Товары.Выгрузить();
    ТаблЗнач.Свернуть("ЗаказПокупателя");
        Для каждого Стр из ТаблЗнач Цикл
         Если ТекАдрес = Неопределено Тогда
            ТекАдрес = Стр.ЗаказПокупателя.АдресДоставки;
        ИначеЕсли ТекАдрес <> Стр.ЗаказПокупателя.АдресДоставки Тогда
            Сообщить ("Адрес доставки не совпадает в заказах." + Стр.ЗаказПокупателя.Номер);
КонецЕсли;
КонецЦикла;