Печать аналогов номенклатуры

1. Самоделкин 2 30.07.15 14:54 Сейчас в теме
1С 7.7 ТиС 9.2
Хочу поправить внешнюю печатную форму ПоступленияТМЦ - postup.ert так, чтобы на печать выводился Аналог (если но есть) или Номенклатура (если его нет).
Вставил ТекстЗапроса в печатную форму:

Процедура Печать(Докум, Устройство=0, КолвоКопий=1)
    Перем НачПовт, КонПовт;

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

ТекстЗапроса =
"
|Номенклатура = Справочник.Аналоги.Владелец;
|Аналог = Справочник.Аналоги.ТекущийЭлемент;
|Поставщик = Справочник.Аналоги.Каталог.ВладелецКаталога;
|Артикул = Справочник.Аналоги.ИдентификаторВКаталоге;
|Группировка Номенклатура без групп;
|Группировка Аналог без групп;
|Условие(Номенклатура в СписокНоменклатуры);
|Условие(Поставщик = СокрЛП(Докум.Контрагент.ЮрФизЛицо.Наименование));
|Условие(Номенклатура = СокрЛП(Докум.Номенклатура.Наименование));
|"
;

Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли;
ТаблицаАналогов = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТаблицаАналогов,0,0);

Потом:
    Пока Докум.ПолучитьСтроку() = 1 Цикл
        НомСтроки = НомСтроки + 1;

        Строчка = 0;
        Если ТаблицаАналогов.НайтиЗначение(Докум.Номенклатура.Наименование,Строчка,"Номенклатура") = 1 Тогда     
        Аналог = ТаблицаАналогов.ПолучитьЗначение(Строчка,"Аналог");
        ПечНоменклатура = Докум.Аналог.Наименование;
        ПечАртикул = Докум.Аналог.ИдентификаторВКаталоге;
        Иначе
        ПечНоменклатура = Докум.Номенклатура.Наименование;
        ПечАртикул = Докум.Номенклатура.Артикул;
        КонецЕсли;
Показать


Соответственно, в Таблице СокрЛП(Докум.Номенклатура.ПолнНаименование) + ?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(Докум.Номенклатура.Артикул), "") заменил на СокрЛП(ПечНоменклатура) и добавил колонку СокрЛП(ПечАртикул).

Ошибок не выдает, но и аналоги не печатает. Что-то не так с кодом. ПОДСКАЖИТЕ!!!!!!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Frogger1971 30.07.15 17:34 Сейчас в теме
(1) Самоделкин,
Таблица = СоздатьОбъект("ТаблицаЗначений");
СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
Таблица.НоваяКолонка ("Номенклатура");
Таблица.Свернуть("Номенклатура","");
Таблица.Выгрузить(СписокНоменклатуры,,,"Номенклатура");


а где заполнение Таблицы?
8. vcv 89 31.07.15 12:44 Сейчас в теме
Главная ошибка в условиях запроса.
|Условие(Поставщик = СокрЛП(Докум.Контрагент.ЮрФизЛицо.Наименование));
|Условие(Номенклатура = СокрЛП(Докум.Номенклатура.Наименование));

Во-первых, строка сравнивается с элементом справочника.
Во-вторых, пока Докум.Номенклатура имеет неопределенное значение вне цикла "Пока Докум.ПолучитьСтроку() = 1 Цикл"
В-третьих в (3) уже сказали.
12. Самоделкин 2 31.07.15 13:23 Сейчас в теме
(8) vcv, не подскажите как поправить?
(11) vcv, нет, максимум 300 позиций.
17. Jill 17 31.07.15 13:58 Сейчас в теме
(12) Самоделкин, чет такое штоль надо:
	Докум.ВыбратьСтроки();
	Пока Докум.ПолучитьСтроку() = 1 Цикл
		ТекНомен=Докум.Номенклатура;
		СпрАналоги.ИспользоватьВладельца(ТекНомен);
		СпрАналоги.ВыбратьЭлементы();
		ТекНаимАналог="";
		Если СпрАналоги.ПолучитьЭлемент()=1 Тогда
			ТекНаимАналог=СокрЛП(СпрАналоги.ТекущийЭлемент().Наименование);
		КонецЕсли;		
		ПечНоменкалатура=?(ПустаяСтрока(ТекНаимАналог)=0,ТекНаимАналог,СокрЛП(ТекНомен.Наименование));		                             
		Сообщить(ПечНоменкалатура);
	КонецЦикла;
Показать


Но оно только первый попавшийся аналог возвращает.
Самоделкин; +1 Ответить
19. vcv 89 31.07.15 14:06 Сейчас в теме
(17) Jill, Не толкайте человека пользоваться выборками. Вдруг он потом пойдёт дописывать 8ку. А там никуда без умения лепить развесистые запросы на стенки каждого сортира...
20. Самоделкин 2 31.07.15 14:21 Сейчас в теме
26. Jill 17 31.07.15 16:30 Сейчас в теме
(19) vcv, запросы это, конечно, хорошо. Но он попросил переделать уже имеющийся файл в котором попозициооный перебор дока имеется.
Изобразил то, что требует меньше телодвижений. И проще для понимания (ориентировался на изображенный код).
Ну и автор заявил что не критично сие...

Если со временем потребуется оптимизация - поднимет ветку и будет копать углубленно. :)
25. Самоделкин 2 31.07.15 15:54 Сейчас в теме
(17) Jill, все работает хорошо.
С П А С И Б О !
18. vcv 89 31.07.15 14:01 Сейчас в теме
(12) Самоделкин,
vcv, не подскажите как поправить?

Сначала правильно сформировать список номенклатуры, по которому фильтровать аналоги.
Таблица = СоздатьОбъект("ТаблицаЗначений");
Докум.ВыгрузитьТабличнуюЧасть(Таблица,"Номенклатура");
Таблица.Свернуть("Номенклатура","");
СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
Таблица.Выгрузить(СписокНоменклатуры,,,"Номенклатура");

Потом сделать правильные условия в запросе:

Контрагент = Докум.Контрагент;

|Условие(Номенклатура в СписокНоменклатуры);
|Условие(Поставщик = Контрагент);

Проверить, что запрос вернул с аналоги с помощью
ТаблицаАналогов.ВыбратьСтроку()

вставив эту строчку после Запрос.Выгрузить.
Строки с ПечНоменклатура и ПечАртикул заменить на
ПечНоменклатура = СокрЛП(Аналог.ПолнНаименование);
ПечАртикул = Аналог.ИдентификаторВКаталоге;
и
ПечНоменклатура = СокрЛП(Докум.Номенклатура.ПолнНаименование);
ПечАртикул = Докум.Номенклатура.Артикул;

Где-то так...
Можно еще артикул аналога брать из результатов запроса, не зря же он там есть :)
Самоделкин; +1 Ответить
21. Самоделкин 2 31.07.15 14:54 Сейчас в теме
(18) vcv,
ТаблицаАналогов.ВыбратьСтроку()

проверил, выдает все правильно.
Изначально было почти также
ПечНоменклатура = СокрЛП(Аналог.ПолнНаименование);
ПечАртикул = Аналог.ИдентификаторВКаталоге;

потом уже стал изгаляться.

Но все-равно не выводит на печать аналог.
16. Frogger1971 31.07.15 13:57 Сейчас в теме
(1) Самоделкин,
Номенклатура = Справочник.Аналоги.Владелец;


если включишь мозг, медитируя на эту строчку, то твое астральное тело подскажет тебе, как из того говно-кода, что у тебя сделано "по аналогии"
сделать код в две строки..
2. Frogger1971 30.07.15 17:31 Сейчас в теме
Если ТаблицаАналогов.НайтиЗначение(Докум.Номенклатура.Наименование,Строчка,"Номенклатура") = 1 Тогда   

проверь отладчиком или хоть раз что-то находит
и СокрЛП(Докум.Номенклатура.Наименование)
4. Самоделкин 2 31.07.15 10:19 Сейчас в теме
(2) Frogger1971, ТаблицаАналогов ничего не ищет. СокрЛП(Докум.Номенклатура.Наименование) - работает.
немного переделал:
Таблица = СоздатьОбъект("ТаблицаЗначений");
Докум.ВыгрузитьТабличнуюЧасть(Таблица,"Номенклатура");
Таблица.Свернуть("Номенклатура","");
СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
Таблица.Выгрузить(СписокНоменклатуры,,,"Номенклатура");

но все-равно не работает.

(3) Frogger1971, по этому пункту можно поподробней?
5. Cooler 22 31.07.15 10:28 Сейчас в теме
Лично мне вообще непонятно - какой смысл использовать тут запрос? Почему бы просто не обращаться к подчиненному справочнику аналогов непосредственно в цикле по строкам документа?
6. Самоделкин 2 31.07.15 11:18 Сейчас в теме
(5) Cooler, буду при много благодарен, если подскажите как.
7. Cooler 22 31.07.15 11:23 Сейчас в теме
(6) Самоделкин, пока что не вижу размера благодарности. :-)
9. vcv 89 31.07.15 12:46 Сейчас в теме
(7) Cooler, "обращаться к подчиненному справочнику аналогов непосредственно в цикле по строкам документа" - не самый быстрый вариант и вообще дурной тон в приличных местах :)
10. Cooler 22 31.07.15 12:51 Сейчас в теме
(9) vcv,
не самый быстрый вариант
Ну да, особенно в процедуре печати: замедление выползания бумажки из принтера на 0,01 секунды недопустимо!

Осознал, расстроился, ушел...
11. vcv 89 31.07.15 12:58 Сейчас в теме
(10) Cooler, У Самоделкина, на сколько помнится, автозапчасти. Вдруг мы обсуждаем печать накладных с 10000+ строк, 100500 номенклатурных позиций с аналогами для полусотни поставщиков. Тут уже 0,01 секунды не обойдёшься ;)
14. Cooler 22 31.07.15 13:33 Сейчас в теме
(11) vcv, мне теперь тоже кое-что про автора припоминается, см. ниже.

(13) falcon,
объясни вот этот участок
Такие вещи объяснены давным-давно - у Николая Васильевича Гоголя в "Мертвых душах":
Видно, что повар руководствовался более каким-то вдохновеньем и клал первое, что попадалось под руку: стоял ли возле него перец - он сыпал перец, капуста ли попалась - совал капусту, пичкал молоко, ветчину, горох - словом, катай-валяй, было бы горячо, а вкус какой-нибудь, верно, выдет.

Правда, с программированием такой подход не очень-то прокатывает.
15. falcon 31.07.15 13:50 Сейчас в теме
(14) у меня больше ассоциации с ирландским рагу из Трое в лодке...
13. falcon 31.07.15 13:26 Сейчас в теме
(0) объясни вот этот участок

 Аналог = ТаблицаАналогов.ПолучитьЗначение(Строчка,"Аналог");
 ПечНоменклатура = Докум.Аналог.Наименование;


если у тебя в Аналоге есть уже значение, зачем вся эта эпопея с запросом и поиском если нет, тогда почему для печати ты используешь то, что в документе, а не то что нашел да и зачем тогда Аналогв документе?
22. falcon 31.07.15 15:13 Сейчас в теме
зачем что-то искать, если в документе уже есть Докум.Аналог?
23. Самоделкин 2 31.07.15 15:31 Сейчас в теме
(22) falcon,
зачем что-то искать, если в документе уже есть Докум.Аналог?

а кто сказал, что есть?
27. falcon 31.07.15 19:24 Сейчас в теме
(23) Самоделкин,
ты сказал... ты сам то в помнишь что в коде пишешь?? )))

ПечНоменклатура = Докум.Аналог.Наименование;
ПечАртикул = Докум.Аналог.ИдентификаторВКаталоге;


если его там нет, то что ты тогда печатаешь.... смешной ты
28. Самоделкин 2 31.07.15 22:47 Сейчас в теме
(27) falcon, читаем (21), а сейчас мне уже все-равно что там я в отпуске.
24. Cooler 22 31.07.15 15:34 Сейчас в теме
(22) falcon,
если в документе уже есть Докум.Аналог?
Я подозреваю, что он там возник прямо в этой ветке, и только в авторском коде.

P.S. Теперь мне вспомнилась басня Крылова "Мартышка и Очки".
29. Cooler 22 31.07.15 23:43 Сейчас в теме
сейчас мне уже все-равно что там я в отпуске
Истинный 1Сник!
30. Sanario 27 25.08.15 10:46 Сейчас в теме
(29) Cooler, ага - ушел в отпуск и обо всем забыл) Еще и телефон выключил :):):)
Оставьте свое сообщение

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