• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Нумерация залов

  • Автор темы Roman
  • Дата начала
R

Roman

Документ Предварительные заявки печатается так, общая заявка со всеми позициями и подзаявки конкретно по залам(места где хранится товар).Как сделать так чтобы в осоновной заявке выводилось из скольких подзаявок сосотоит данная предзаявка, а предзаявки нумеровались по залам,например:
Корма это подзавка номер один,Игрушки это заявка номер два и т.д. в 1С версии 7.7 Конфигурация Торговля и склад.
 
V

vitfil

Ну и постановка вопроса...
В общем случае: модифицировать процедуру печати необходимым образом.
 
R

Roman

Ну и постановка вопроса...
В общем случае: модифицировать процедуру печати необходимым образом.
Я кодить не умею,пока изучаю.
Вот исходный код процедуры печати
Код:
Процедура ПечатьЗал(пЗал,БПСпособПечати)
Перем НачПовт, КонПовт;					 

РегХран=СоздатьОбъект("Регистр.ХранениеТовара");
ТЗН=СоздатьОбъект("ТаблицаЗначений");

ИсхТабл = СоздатьОбъект("Таблица");
ИсхТабл.ИсходнаяТаблица("ПоЗалам");
НачПовт = 0; КонПовт = 0;
ПечФирма = ""; Банк = ""; Счет = ""; БИК = ""; СчетБанка = "";

Параметры = СоздатьОбъект("СписокЗначений");
//Я добавил{
Номер="";
Если Номенклатура.ЗалХранения=СокрЛП("Общий зал") Тогда
Номер=Номер+"1";
КонецЕсли;
//}Я добавил
ИсхТабл.ВывестиСекцию("Заголовок");
НачПовт = НачПовт + ИсхТабл.ВысотаСекции("Заголовок");
ИсхТабл.ВывестиСекцию("Шапка");
КонПовт = НачПовт + ИсхТабл.ВысотаСекции("Шапка");
ИсхТабл.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);
НомСтроки = 0;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если Номенклатура.ЗалХранения=пЗал Тогда
НомСтроки = НомСтроки + 1;
РегХран.УстановитьФильтр(,Номенклатура);
РегХран.ВыгрузитьИтоги(ТЗН);
МХ="";
ТЗН.ВыбратьСтроки();
Пока ТЗН.ПолучитьСтроку()=1 Цикл
МХ=МХ+СокрЛП(ТЗН.Место.Код)+"; ";
КонецЦикла;		
ИсхТабл.ВывестиСекцию("Строка");
КонецЕсли;
КонецЦикла;




ИсхТабл.ВывестиСекцию("Итоги");
Если БПСпособПечати = 1 Тогда
СразуНаПринтер = 0;
Иначе				 
СразуНаПринтер = 1;
КонецЕсли;
Если СразуНаПринтер = 0 Тогда
ИсхТабл.Опции(0,0,0,0,"ОпцииПечатиПлПор","ПараметрыОкнаПлПор");
ИсхТабл.ПараметрыСтраницы(1,,,,,,,,,1,,"Brother MFC-8820D USB");
ИсхТабл.Защита(1);
ИсхТабл.ТолькоПросмотр(0);
ИсхТабл.Показать(глНазваниеДокументаВжурнале(Контекст),""); 
Иначе	 
ИсхТабл.ПараметрыСтраницы(1,,,,,,,,,1,,"Brother MFC-8820D USB");
ИсхТабл.Напечатать(0);
КонецЕсли; 

КонецПроцедуры // ПечатьЗал();
Вот я написал пару строк, но вместо того чтобы в таблице подставлять на место переменной "Номер" еденицу, в подзаявке общий зал
он выдает пустое значение
 
P

perfomance

//Я добавил{
Номер="";
Если Номенклатура.ЗалХранения=СокрЛП("Общий зал") Тогда
Номер=Номер+"1";
КонецЕсли;
//}Я добавил

Вот я написал пару строк, но вместо того чтобы в таблице подставлять на место переменной "Номер" еденицу, в подзаявке общий зал
он выдает пустое значение

Ну если разбирать только этот кусок кода , то здесь выражение Номенклатура.ЗалХранения скорее относится к табличной части документа. Поэтому эту конструкцию Если (условие) КонецЕсли надо помещать в цикл выбора-получения строк табличной части документа.

Опиши подробнее в этой конструкции чем будет переменная Номер разумеется если у тебя есть не только "общий зал" а еще что либо Конструкцией Если...ИначеЕсли...Иначе...КонецЕсли; Загони эту конструкцию в цикл Пока ПолучитьСтроку() КонецЦикла;. А также не забуть на самой печатной форме поправить/добавить значение этой переменной в определенную (нужную) тебе ячейку,включи ее в секцию и т.д.
 
R

Roman

Делаю так:
Код:
	Ном="";
ВыбратьСтроки();
Пока ПолучитьСтроку() =1 Цикл
Если СокрЛП(пЗал) = "общий зал" Тогда
Ном = "1";
ИначеЕсли СокрЛП(пЗал) = "Коля клетки" Тогда
Ном = "2";
ИначеЕсли СокрлП(пЗал) = "Акмаль корма" Тогда
Ном ="3";
ИначеЕсли СокрЛп(пЗал) = "Фарход (аквариумы, серко," Тогда
Ном = "4";
ИначеЕсли СокрлП(пЗАл) = "Женя беафар" Тогда
Ном = "5";		
КонецЕсли;
КонецЦикла;
Все нормуль
Но как сделать так чтобы не писать каждый раз при добавлении новой позиции,
а чтобы подзаявки нумеровались автоматически?
И как сделать Чтобы в основной заявке выдавлось из скольких подзаявок она состоит
основная заявка выводится в процедуре печать(), рублевая заявка(таблица"РублеваяЗаявка")
а подзаявки через процедуру печатьзалы(),Таблица:"ПоЗалам"???
 
H

Hryv

Если пЗал - это справочник, то сделайте в нем реквизит НомерЗала и тогда получится

Код:
	Ном="";
ВыбратьСтроки();
Пока ПолучитьСтроку() =1 Цикл
Ном = СокрЛП(пЗал.НомерЗала);
КонецЦикла;
 
R

Roman

Если пЗал - это справочник, то сделайте в нем реквизит НомерЗала и тогда получится

Код:
	Ном="";
ВыбратьСтроки();
Пока ПолучитьСтроку() =1 Цикл
Ном = СокрЛП(пЗал.НомерЗала);
КонецЦикла;
Спасибочки.хорошая тема.
Всё работает.а главновое, всё гениальное,просто.
а с общей заявкой не подсобищь? Как сделать чтобы выводилось из какаого количества подзаявок она состоит.?
 
H

Hryv

Там откуда вызавыется ПечатьЗал(пЗал,БПСпособПечати) думаю несложно посчитать количество вызовов, я предполагаю, что там вызовы идут в цикле
 
R

Roman

Там откуда вызавыется ПечатьЗал(пЗал,БПСпособПечати) думаю несложно посчитать количество вызовов, я предполагаю, что там вызовы идут в цикле
А как их посчитать и как потом подсчитанное число вывести в печатную Форму
 
H

Hryv

Посмотрел код в начале темы, пришел к выводу: предложенный мной код можно сократить до 1 строки

Ном = СокрЛП(пЗал.НомерЗала);

Перебор строк там смысла не имеет

А как их посчитать и как потом подсчитанное число вывести в печатную Форму

Ну давай код процедуры откуда идет вызов
 
R

Roman

Код:
		// рублевая заявка
Если (Р_накл = 1) и (К_Руб_н > 0) 	Тогда	 

РегХран=СоздатьОбъект("Регистр.ХранениеТовара");
ТЗН=СоздатьОбъект("ТаблицаЗначений");

ИсхТабл = СоздатьОбъект("Таблица");
ИсхТабл.ИсходнаяТаблица("РублеваяЗаявка");
НачПовт = 0; КонПовт = 0;
ПечФирма = ""; Банк = ""; Счет = ""; БИК = ""; СчетБанка = "";

Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(БанковскийСчет, "БанковскийСчет");
глРеквизитыПлательщикаПолучателя(Параметры);
ПечФирма 	= Параметры.Получить("Результат");
Банк		= Параметры.Получить("СтрокаБанка");
Счет		= Параметры.Получить("РасчетныйСчет");
БИК			= Параметры.Получить("БИК");
СчетБанка	= Параметры.Получить("КоррСчет");

ИсхТабл.ВывестиСекцию("Заголовок");
НачПовт = НачПовт + ИсхТабл.ВысотаСекции("Заголовок");
ИсхТабл.ВывестиСекцию("Шапка");
КонПовт = НачПовт + ИсхТабл.ВысотаСекции("Шапка");
ИсхТабл.ПовторятьПриПечатиСтроки(НачПовт + 1, КонПовт);
НомСтроки = 0;
ВыбратьСтроки();
ВсегоСумма=0;
ВсегоНДС=0;
Пока ПолучитьСтроку() = 1 Цикл
НомСтроки = НомСтроки + 1;
Если Валюта.Наименование="руб." Тогда
ЦенаДок=Окр(Цена-Скидка.Процент/100*Цена,2,1);
СуммаДок=Окр(ЦенаДок*Количество,2,1);
Иначе
ЦенаДок=Окр(Окр(Цена-Скидка.Процент/100*Цена,3,1)*КурсДляВалюты(Валюта),2,1); //глКурсДляВалюты(Договор.ВалютаВзаиморасчетов,ДатаДок),2,1);
СуммаДок=Окр(ЦенаДок*Количество,3,1);
КонецЕсли;
Если СуммаВклНДС=1 Тогда
НДСДок=СуммаДок*глВыделяемыйНДС(СтавкаНДС);
Иначе
НДСДок=СуммаДок*глНачисляемыйНДС(СтавкаНДС);
КонецЕсли;

//НДСДок=Окр(СуммаНДС*КурсДляВалюты(Валюта),2,1); //глКурсДляВалюты(Договор.ВалютаВзаиморасчетов,ДатаДок),2,1);
ВсегоНДС=Окр(ВсегоНДС+НДСДок,2,1);
ВсегоСумма=Окр(ВсегоСумма+СуммаДок,2,1);
РегХран.УстановитьФильтр(,Номенклатура);
РегХран.ВыгрузитьИтоги(ТЗН);
МХ="";
ТЗН.ВыбратьСтроки();
Пока ТЗН.ПолучитьСтроку()=1 Цикл
МХ=МХ+СокрЛП(ТЗН.Место.Код)+"; ";
КонецЦикла;

ИсхТабл.ВывестиСекцию("Строка");
КонецЦикла;
ИсхТабл.ВывестиСекцию("Итоги");
Если БПСпособПечати = 1 Тогда
СразуНаПринтер = 0;
Иначе				 
СразуНаПринтер = 1;
КонецЕсли;
Если СразуНаПринтер = 0 Тогда
ИсхТабл.Опции(0,0,0,0,"ОпцииПечатиПлПор","ПараметрыОкнаПлПор");
ИсхТабл.ПараметрыСтраницы(1,,,,,,,,,1,,"Brother MFC-8820D USB");
ИсхТабл.Защита(1);
ИсхТабл.ТолькоПросмотр(0);
ИсхТабл.Показать(глНазваниеДокументаВжурнале(Контекст),""); 
Иначе	 
ИсхТабл.ПараметрыСтраницы(1,,,,,,,,,1,,"Brother MFC-8820D USB");
ИсхТабл.КоличествоЭкземпляров(К_Руб_н);
ИсхТабл.Напечатать(0);
КонецЕсли; 

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

Если СписокЗалов.Принадлежит(Номенклатура.ЗалХранения)=0 Тогда
СписокЗалов.ДобавитьЗначение(Номенклатура.ЗалХранения);
КонецЕсли;
КонецЦикла;												 

ПечататьЗалы=1;
Если БезЗалов=1 Тогда
Если Вопрос("Для некоторых позиций неуказана зона отгрузки. Печатать без зон?","Да+Нет")<>"Да" Тогда
ПечататьЗалы=0;
КонецЕсли;
КонецЕсли;

Если ПечататьЗалы=1 Тогда
Для Сч=1 По СписокЗалов.РазмерСписка() Цикл
ПечатьЗал(СписокЗалов.ПолучитьЗначение(Сч),БПСпособПечати);
КонецЦикла;
КонецЕсли;

КонецЕсли;

Код:
Если ПечататьЗалы=1 Тогда
Для Сч=1 По СписокЗалов.РазмерСписка() Цикл
ПечатьЗал(СписокЗалов.ПолучитьЗначение(Сч),БПСпособПечати);
КонецЦикла;
КонецЕсли;

КонецЕсли;
Если Делаешь запрос Соообщить(Сч) он мне пишет сколько циклов он проходит
но как кодом сделать так чтобы он мне
в табличную часть итог выводил а не в окно сообщений?
 
H

Hryv

СписокЗалов.РазмерСписка() - это и есть твое количество залов

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

перенеси перед

ИсхТабл.ВывестиСекцию("Заголовок");

И еще перед ИсхТабл.ВывестиСекцию("Заголовок"); вставь
КоличествоЗалов = СписокЗалов.РазмерСписка();

И в "шапке" или в "заголовке" выводи переменную КоличествоЗалов
 
R

Roman

Спасибо.
но вот с подзаявками пустая работа.
Если делать так сделано: Ном=СокрЛП(пЗал.номерзала);
и создать реквизит номер зала в справочнике
так он мне и выдает номер зала, а мне надо чтоб подзаявки нумеровались по порядку а не согласно номеру зала
а то двойная информация получается. Название зала уже и так выводится и теперь еще номер зала.
Как сделать нумерацию подзаявок?
 
H

Hryv

Ты бы сначала определился что тебе надо


Вот так сделай

Если ПечататьЗалы=1 Тогда
Для Сч=1 По СписокЗалов.РазмерСписка() Цикл
ПечатьЗал(СписокЗалов.ПолучитьЗначение(Сч),БПСпособПечати, Сч);
КонецЦикла;
КонецЕсли;

и

Процедура ПечатьЗал(пЗал,БПСпособПечати, Номер)

из самой процедуры вычисление Номера совсем убери
 
P

perfomance

Спасибо.
но вот с подзаявками пустая работа.
Если делать так сделано: Ном=СокрЛП(пЗал.номерзала);
и создать реквизит номер зала в справочнике
так он мне и выдает номер зала, а мне надо чтоб подзаявки нумеровались по порядку а не согласно номеру зала
а то двойная информация получается. Название зала уже и так выводится и теперь еще номер зала.
Как сделать нумерацию подзаявок?

Как понимаю Вам из всего этого хочеться получить печатную форму по типу

Шапка документа (Грубо говоря секция "ГолУб")
Зал 1 (Наименование зала) (секция "НазваниеЗала")
товар1.1 (Наименование товара принадлежащего залу 1) (секция "Номенклатура")
товар1.2
товар1.N
Зал N (Наименование зала)
товарN.1(наименование товара принадлежащего залу N)
товарN.N
 
R

Roman

Как понимаю Вам из всего этого хочеться получить печатную форму по типу

Шапка документа (Грубо говоря секция "ГолУб")
Зал 1 (Наименование зала) (секция "НазваниеЗала")
товар1.1 (Наименование товара принадлежащего залу 1) (секция "Номенклатура")
товар1.2
товар1.N
Зал N (Наименование зала)
товарN.1(наименование товара принадлежащего залу N)
товарN.N
Нет совсем не то.
Печать предварительных заявок происходит по следующей схеме
предзавка(основноая)-все позиции
подзаявка(что-то типа: зал1) - позиции из зал1
подзаявка(что-то типа: зал2) - позиции из зала2
ит.д.
Надо чтобы Каждая подзаявка нумеравалась
подзаявка№1
подзаявка№2
подзаявка№3
Сколько залов столько подзаявок, но нумероваться онидолжны согласно выходу , а не залу т.е. заявка№2 может быть "зал7"
Вот что-то типа того.



А название зала и так в подзаявка выводится в шапке документа переменной пЗал

Ты бы сначала определился что тебе надо


Вот так сделай

Если ПечататьЗалы=1 Тогда
Для Сч=1 По СписокЗалов.РазмерСписка() Цикл
ПечатьЗал(СписокЗалов.ПолучитьЗначение(Сч),БПСпособПечати, Сч);
КонецЦикла;
КонецЕсли;

и

Процедура ПечатьЗал(пЗал,БПСпособПечати, Номер)

из самой процедуры вычисление Номера совсем убери
Спасибо еще раз.
надо срочно дочитывать документацию по 1С. а то всё оказывается просто(когда знаешь как) :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!