|
Проверка циклом определённых данных. | ☑ | ||
---|---|---|---|---|
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
|
Решил свой вопрос, код такой. Всем пасиба)
ТаблЗнач = ЭтаФорма.Товары.Выгрузить(); ТаблЗнач.Свернуть("ЗаказПокупателя"); Для каждого Стр из ТаблЗнач Цикл Если ТекАдрес = Неопределено Тогда ТекАдрес = Стр.ЗаказПокупателя.АдресДоставки; ИначеЕсли ТекАдрес <> Стр.ЗаказПокупателя.АдресДоставки Тогда Сообщить ("Адрес доставки не совпадает в заказах." + Стр.ЗаказПокупателя.Номер); КонецЕсли; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |