PDA

Просмотр полной версии : Нужна помощь в изменении обработки



Perefly
15.11.2013, 09:22
Прошу помощи, т.к. в программировании 1с я валенок.
Нужно добавить в Бланк товарного наполнения (ПечатьРаскладкиНоменклат� �рыПоМестамХранения) графу Покупатель.
Вроде что-то изменила, но где должна быть фамилия контрагента пишется ПолноеНаименование, вообщем получается как на рисунке. 1111
Подскажите, пожалуйста, как это исправить.
Заранее большое спасибо за помощь!

Сам код в модуле:

Если ВыводитьЗаголовок Тогда // выведем заголовок
Секция = мМакет.ПолучитьОбласть("Заголовок");


Секция.Параметры.ТекстЗаго ловка = СокрЛП(Документ);
Секция.Параметры.Склад = СокрЛП(мСклад);
мТабДок.Вывести(Секция);
КонецЕсли;


Секция = мМакет.ПолучитьОбласть("Покупатель");
Секция.Параметры.Представл ениеПолучателя = ("ПолноеНаименование");
мТабДок.Вывести(Секция);

Секция = мМакет.ПолучитьОбласть("ВремяПечати");
Секция.Параметры.ВремяПеча ти = "Дата и время печати: " + ТекущаяДата() + ". Пользователь: " + СокрЛП(глЗначениеПеременн� �й("глТекущийПользователь"));
мТабДок.Вывести(Секция);

Владислав80
16.11.2013, 00:28
Секция.Параметры.Представл ениеПолучателя = ("ПолноеНаименование");
Вы вроде как строку передаете "ПолноеНаименование", вот она у вас и выводится.
Что за конфигурация? Скиньте обработку саму.
Попробуйте кавычки убрать в ("ПолноеНаименование"); Да и скобок я не припомню в выводе в макет через параметры.

Poluk
10.12.2013, 15:32
Секция.Параметры.Представл ениеПолучателя = ("ПолноеНаименование"); - не нужны кавычки. Если они стоят то выводится текст помещенный между ними. Необходимо после знака "=" написать переменную, которая содержит полное наименование представления получателя.

lerikspb
16.01.2014, 19:07
Добрый день. Не знаю куда писать(в какую тему) по этому поводу... У меня есть обработка для 8.2(бухгалтерия предприятия) формирование поступления товаров и услуг на основании реализации товаров и услуг. в 8.3 она конечно же не работает. я открыла ее как то через толстый клиент в конфигураторе, но при попытке сформировать документ прихода вылетает вот такая дребедень
{Форма.Форма.Форма(63)}: Ошибка при вызове метода контекста (Выполнить)
Выборка1 = Запрос1.Выполнить().Выбрать( );
по причине:
{(23, 25)}: Поле не найдено "РеализацияТоваровУслуг.Уч� �тыватьНДС"
РеализацияТоваровУслуг.<<?>>УчитыватьНДС
Если кто может помочь пишите!!

Poluk
16.01.2014, 23:27
Структура метаданных в похоже разная... у документа РеализацияТоваровУслуг нету реквизита УчитыватьНДС. Нужно править запрос, и скорее еще много чего... обратиться к программистам советую! Но это будет стоить денег....

Perefly
17.01.2014, 12:37
Спасибо, что откликнулись, сделала, как сказали убрали кавычки. Теперь другая проблема, пишет Не удалось определить значение параметра организации: ПолноеНаименование, ИНН, ОГРН и тд


#Если Клиент Тогда

Перем мТабДок;

Перем мКоличествоГруппировок;

Перем мКоличествоДопПолейПосле;
Перем мКоличествоДопПолейДо;
Перем мКоличествоДопПолейВместе ;

Перем мСоответствиеГруппировок;

Перем мСоответствиеДопПолейДо;
Перем мСоответствиеДопПолейПосл е;
Перем мСоответствиеДопПолейВмес те;

Перем мСписокПоложенийДляПечати Экспорт;

Перем мСписокНачало;
Перем мСписокНоменклатура;
Перем мСписокДопПоле;

Перем мСписокГруппаНачало;
Перем мСписокГруппаНоменклатура ;
Перем мСписокГруппаДопПоле;

Перем мСпециальныеПоля;

Перем мИмяРеквизитаСклад;
Перем мСклад;

Перем мИмяМакета Экспорт;

Перем мМакет;

Перем мИнициализироватьНастройк иПриОткрытии Экспорт;

Перем мТекущаяНастройка Экспорт;

Перем мНомерСтроки;

Перем мИзмеренияСтроки;

Перем мЕдиницаИзмеренияВеса;

Перем мПоляСПредставлениями;

Перем мВесВведенНеДляВсехТоваро в;
Перем мИтогВес;

// Процедура осуществляет вызов формирования печатной формы из документа.
//
// Параметры:
//
//
Процедура НапечататьИзДокумента(Док, ИмяМакета = Неопределено, ПечататьТолькоНеотсканиро ванные = Неопределено, НаПринтер = Ложь) Экспорт

Если ИмяМакета <> Неопределено Тогда
мИмяМакета = ИмяМакета;
КонецЕсли;

Если ПечататьТолькоНеотсканиро ванные <> Неопределено Тогда
ТолькоНеотсканированныйТо вар = ПечататьТолькоНеотсканиро ванные;
КонецЕсли;

ВидДокументов = Док.Метаданные().Имя;
Документ = Док;
ВосстановитьНастройкиПриО ткрытии();

Если ПоказыватьФорму Тогда
мИнициализироватьНастройк иПриОткрытии = Ложь;

ПолучитьФорму().Открыть();
Иначе
Печать(НаПринтер);
КонецЕсли;

КонецПроцедуры // НапечататьИзДокумента()

// Формирует структуру для сохранения настроек отчета
//
Процедура СформироватьСтруктуруДляС охраненияНастроек(Структу� �аСНастройками) Экспорт

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


КонецПроцедуры // СформироватьСтруктуруДляС охраненияНастроек()

// Процедура открывает форму настройки из документа.
//
// Параметры:
// ТекДок - Ссылка на документ, из которого открыта форма.
//
Процедура ОткрытьФормуНастройкиИзДо кумента(Док) Экспорт

ВидДокументов = Док.Метаданные().Имя;
Документ = Док;
ВосстановитьНастройкиПриО ткрытии();
мИнициализироватьНастройк иПриОткрытии = Ложь;
ПолучитьФорму().Открыть();

КонецПроцедуры // ОткрытьФормуНастройкиИзДо кумента()

// Функция выводит поле в шапку отчета. Возвращает количество выведенных полей.
//
// Параметры:
// ДопПоле - поле, которое нужно вывести.
// РезультатЗапроса - результат запроса.
// Секция - выводимая секция.
//
// Возвращаемое значение:
// Число - количество выведенных полей.
//
Функция ВывестиПолеВШапку(ДопПоле, РезультатЗапроса, Знач Секция)

КоличествоПолей = 0;

Если мСпециальныеПоля[ДопПоле.Имя] = 0 Тогда // "МестоХранения"
Выборка = РезультатЗапроса.Выбрать(О бходРезультатаЗапроса.ПоГ� �уппировкам, "Приоритет", "Все");
Пока Выборка.Следующий() Цикл
СтрокаПредставленияПриори тета = ПредставленияПриоритетовМ естХранения.Найти(Выборка.� �риоритет, "Приоритет");
Если СтрокаПредставленияПриори тета = Неопределено Тогда
НазваниеКолонки = ДопПоле.Псевдоним + ?(Выборка.Количество() = 1, "", " " + (Выборка.Приоритет));
Иначе
НазваниеКолонки = СтрокаПредставленияПриори тета.Псевдоним;
КонецЕсли;

Секция.Параметры.ДопПоле = НазваниеКолонки;
мТабДок.Присоединить(Секци я);

КоличествоПолей = КоличествоПолей + 1;
КонецЦикла;
ИначеЕсли мСпециальныеПоля[ДопПоле.Имя] = 1 Тогда // "Остаток"
Секция = мМакет.ПолучитьОбласть("Шапка|ДопПолеОстаток");

Выборка = РезультатЗапроса.Выбрать(О бходРезультатаЗапроса.ПоГ� �уппировкам, "Склад", "Все");
Пока Выборка.Следующий() Цикл
НазваниеКолонки = СокрЛП(Выборка.СкладПредст авление);
Если Не ПустаяСтрока(ДопПоле.Псевд оним) Тогда
НазваниеКолонки = НазваниеКолонки + Символы.ПС + ДопПоле.Псевдоним;
КонецЕсли;

Секция.Параметры.ДопПоле = НазваниеКолонки;
мТабДок.Присоединить(Секци я);

КоличествоПолей = КоличествоПолей + 1;
КонецЦикла;
Иначе
Секция.Параметры.ДопПоле = ДопПоле.Псевдоним;
мТабДок.Присоединить(Секци я);

КоличествоПолей = КоличествоПолей + 1;
КонецЕсли;

Возврат КоличествоПолей;

КонецФункции // ВывестиПолеВШапку()

// Процедура выводит поле в отчет.
//
// Параметры:
// ДопПоле - поле, которое нужно вывести.
// РезультатЗапроса - результат запроса.
// Секция - выводимая секция.
//
Процедура ВывестиПолеВОтчет(ДопПоле, Выборка, Знач Секция)

Если мСпециальныеПоля[ДопПоле] = 0 Тогда // "МестоХранения"
ВыборкаДопПоле = Выборка.Выбрать(ОбходРезул ьтатаЗапроса.ПоГруппировк� �м, "Приоритет", "Все");
Пока ВыборкаДопПоле.Следующий() Цикл
Секция.Параметры.ЗначениеД опПоля = ВыборкаДопПоле[ДопПоле];
Секция.ТекущаяОбласть.Гори зонтальноеПоложение = ТаблицаНастройкиПолейПеча ть.Найти(ДопПоле, "Имя").Выравнивание;
мТабДок.Присоединить(Секци я);
КонецЦикла;
ИначеЕсли мСпециальныеПоля[ДопПоле] = 1 Тогда // "Остаток"
Секция = мМакет.ПолучитьОбласть("Список|ДопПолеОстаток");

ВыборкаДопПоле = Выборка.Выбрать(ОбходРезул ьтатаЗапроса.ПоГруппировк� �м, "Склад", "Все");
Пока ВыборкаДопПоле.Следующий() Цикл
Секция.Параметры.ЗначениеД опПоля = ВыборкаДопПоле.Остаток;
Секция.ТекущаяОбласть.Гори зонтальноеПоложение = ТаблицаНастройкиПолейПеча ть.Найти(ДопПоле, "Имя").Выравнивание;
мТабДок.Присоединить(Секци я);
КонецЦикла;
Иначе
Если мПоляСПредставлениями[ДопПоле] = Неопределено Тогда
ПредставлениеПоля = Выборка[ДопПоле];
Иначе
ПредставлениеПоля = Выборка[ДопПоле + "Представление"];
КонецЕсли;

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

КонецПроцедуры // ВывестиПолеВОтчет()

// Процедура выводит пустое поле в отчет.
//
// Параметры:
// ДопПоле - поле, которое нужно вывести.
// РезультатЗапроса - результат запроса.
// Секция - выводимая секция.
//
Процедура ВывестиПустоеПолеВОтчет(Д� �пПоле, Выборка, Знач Секция)

Если мСпециальныеПоля[ДопПоле] = 0 Тогда // "МестоХранения"
ВыборкаДопПоле = Выборка.Выбрать(ОбходРезул ьтатаЗапроса.ПоГруппировк� �м, "Приоритет", "Все");
Пока ВыборкаДопПоле.Следующий() Цикл
Секция.Параметры.ЗначениеД опПоля = "";
мТабДок.Присоединить(Секци я);
КонецЦикла;
ИначеЕсли мСпециальныеПоля[ДопПоле] = 1 Тогда // "Остаток"
Секция = мМакет.ПолучитьОбласть("СписокГруппа|ДопПолеОстат� �к");

ВыборкаДопПоле = Выборка.Выбрать(ОбходРезул ьтатаЗапроса.ПоГруппировк� �м, "Склад", "Все");
Пока ВыборкаДопПоле.Следующий() Цикл
Секция.Параметры.ЗначениеД опПоля = "";
мТабДок.Присоединить(Секци я);
КонецЦикла;
Иначе
Секция.Параметры.ЗначениеД опПоля = "";
мТабДок.Присоединить(Секци я);
КонецЕсли;

КонецПроцедуры // ВывестиПустоеПолеВОтчет()

// Процедура устанавливает ширину колонок полей.
//
// Параметры:
// ДопПоле - поле, которое нужно вывести.
// РезультатЗапроса - результат запроса.
// Секция - выводимая секция.
//
Функция УстановитьШиринуПолей(Доп� �оле, РезультатЗапроса, ТекКолонка)

Если мСпециальныеПоля[ДопПоле] = 0 Тогда // "МестоХранения"
КоличествоПолей = 0;
ВыборкаДопПоле = РезультатЗапроса.Выбрать(О бходРезультатаЗапроса.ПоГ� �уппировкам, "Приоритет", "Все");
Пока ВыборкаДопПоле.Следующий() Цикл
мТабДок.Область(, ТекКолонка + КоличествоПолей, , ТекКолонка + КоличествоПолей).ШиринаКол онки = ТаблицаНастройкиПолейПеча ть.Найти(ДопПоле).Ширина;

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

КоличествоПолей = КоличествоПолей + 1;
КонецЦикла;
Иначе
мТабДок.Область(, ТекКолонка, , ТекКолонка).ШиринаКолонки = ТаблицаНастройкиПолейПеча ть.Найти(ДопПоле).Ширина;

КоличествоПолей = 1;
КонецЕсли;

Возврат КоличествоПолей;

КонецФункции // УстановитьШиринуПолей()

// Процедура обновляет построитель отчета.
// Установленные настройки при этом не изменяются.
//
Процедура ОбновитьПостроительОтчета () Экспорт

Настройки = ПостроительОтчета.Получит� �Настройки();

ЗаполнитьПостроительОтчет а();

ПостроительОтчета.Установ� �тьНастройки(Настройки);

КонецПроцедуры // ОбновитьПостроительОтчета ()

// Проверяет корректность установленных пользователем настроек.
//
// Параметры:
// Отказ - в этот параметр возвращается значение Истина, если обнаружены ошибки.
//
Процедура ПроверитьКорректностьНаст роек(Отказ)

Если Не ЗначениеЗаполнено(Докумен� �) Тогда
Предупреждение("Не выбран документ для печати!");
Отказ = Истина;

Возврат;
КонецЕсли;

//Если СписокСкладов.Количество() = 0 Тогда
// Предупреждение("Не выбраны склады!");
// Отказ = Истина;

// Возврат;
//КонецЕсли;

Если КоличествоУровнейМестХран ения = 0 Тогда
Предупреждение("Не указано количество уровней мест хранения!");
Отказ = Истина;

Возврат;
КонецЕсли;

КоличествоИзмерений = ПостроительОтчета.Измерен� �яСтроки.Количество() - 1;

ИзмерениеНоменклатура = ПостроительОтчета.Измерен� �яСтроки.Найти("Номенклатура");

Если ИзмерениеНоменклатура = Неопределено Тогда
Предупреждение("Отсутствует обязательная группировка но номенклатуре!");

Отказ = Истина;
Возврат;
КонецЕсли;

Индекс = ПостроительОтчета.Измерен� �яСтроки.Индекс(ИзмерениеН� �менклатура);

Если Индекс <> КоличествоИзмерений Тогда
Предупреждение ("Группировка: ""Номенклатура"" должна быть последней в измерениях строк.");
ПостроительОтчета.Измерен� �яСтроки.Сдвинуть(Измерени� �Номенклатура, КоличествоИзмерений - Индекс);
КонецЕсли;

СоответствиеСтрок = Новый Соответствие;
Для Каждого СтрокаПостроителя Из ПостроительОтчета.Измерен� �яСтроки Цикл
Если СоответствиеСтрок[СтрокаПостроителя.ПутьКДа� �ным] = Неопределено Тогда
СоответствиеСтрок.Вставит� �(СтрокаПостроителя.ПутьКД� �нным, СтрокаПостроителя);
Иначе
Предупреждение("Повторяющаяся группировка " + СтрокаПостроителя.Предста� �ление + "." + Символы.ПС +
"Нельзя использовать одинаковые поля группировки строк!");

Отказ = Истина;
Прервать;
КонецЕсли;
КонецЦикла;

КонецПроцедуры // ПроверитьКорректностьНаст роек()

// В текст для построителя отчета вставляет свойства.
// Скопирована из общего модуля и изменена.
Процедура ДобавитьВТекстСвойстваЛок ально(ТаблицаПолей, Текст, СтруктураПредставлениеПол ей, мСоответствиеНазначений,
СтруктураПараметры, ТекстИсточникиСведений="", ТекстПоляКатегорий="",
ТекстПоляСвойств="", ТекстПоляСгруппироватьПо = "",
ЗаменятьСвойства = "//СВОЙСТВА", ЗаменятьКатегории = "//КАТЕГОРИИ",
ЗаменятьСоединения = "//СОЕДИНЕНИЯ", ЗаменятьСгруппироватьПо = "//СГРУППИРОВАТЬПО",
ИдентификаторыПараметровД ляОтборовПоКатегориям = "", ЗаменятьИтоги = "//ИТОГИ",
ЗаменятьПредставления = "//ПРЕДСТАВЛЕНИЯ_СВОЙСТВА") Экспорт

// Добавляемые фрагменты запроса.
ТекстПоляСвойствДляГруппи ровки = "";
ТекстИсточникиСведений ="";
ТекстПоляСвойств = "";
ТекстПоляСвойствИтоги = "";
ТекстПоляСвойствПредставл ения = "";

Индекс = 0;

СвойстваОбъектов = ПланыВидовХарактеристик.С� �ойстваОбъектов.Выбрать();

Пока СвойстваОбъектов.Следующи� �() Цикл
Если СвойстваОбъектов.ЭтоГрупп� � ИЛИ СвойстваОбъектов.ПометкаУ� �аления Тогда
Продолжить;
КонецЕсли;

Поля = ТаблицаПолей.НайтиСтроки(Н овый Структура("Назначение", СвойстваОбъектов.Назначен� �еСвойства));

Для Каждого Поле из Поля Цикл

// Для списка всех полей.
ТекстПоляСвойств = ТекстПоляСвойств + ",
| Свойство" + Индекс + ".Значение" + " КАК " + "Свойство" + Индекс + "Значение";

ТекстПоляСвойствИтоги = ТекстПоляСвойствИтоги + ",
| МИНИМУМ(Свойство" + Индекс + ".Значение)";

ТекстПоляСвойствПредставл ения = ТекстПоляСвойствПредставл ения + ",
| Свойство" + Индекс + ".Значение.Представление" + " КАК " + "Свойство" + Индекс + "ЗначениеПредставление";

ТекстПоляСвойствДляГруппи ровки = ТекстПоляСвойствДляГруппи ровки + ",
| Свойство" + Индекс + ".Значение";

// Источник для свойств.
ТекстИсточникиСведений = ТекстИсточникиСведений + Символы.ПС +
"{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияС� �ойствОбъектов КАК Свойство" + Индекс + "
|ПО Свойство" + Индекс + ".Объект = " + Поле.ПутьКДанным + "
|И Свойство" + Индекс + ".Свойство = &ПараметрСвойство" + Индекс + "}";

СтруктураПараметры.Встави� �ь("ПараметрСвойство" + Индекс, СвойстваОбъектов.Ссылка);

СтруктураПредставлениеПол ей.Вставить("Свойство" + Индекс + "Значение", СвойстваОбъектов.Наименов� �ние + " (св-во " + Поле.Представление + ")");

мСоответствиеНазначений.В� �тавить(СвойстваОбъектов.Н� �именование + " (св-во " + Поле.Представление + ")", СвойстваОбъектов.Ссылка);

Индекс = Индекс + 1;
КонецЦикла;
КонецЦикла;

Текст = СтрЗаменить(Текст, ЗаменятьСвойства, ТекстПоляСвойств);
Текст = СтрЗаменить(Текст, ЗаменятьИтоги, ТекстПоляСвойствИтоги);
Текст = СтрЗаменить(Текст, ЗаменятьПредставления, ТекстПоляСвойствПредставл ения);
Текст = СтрЗаменить(Текст, ЗаменятьСоединения, ТекстИсточникиСведений);
Текст = СтрЗаменить(Текст, ЗаменятьСгруппироватьПо, ТекстПоляСвойствДляГруппи ровки);

КонецПроцедуры // ДобавитьВТекстСвойстваЛок ально()

// Производит рекурсивный обход выборки,
// выводит в макет строки из текущей выборки.
//
// Параметры:
// Выборка - текущая выборка.
// НомерГруппировки - текущий номер группировки строк.
//
Процедура ВывестиСтроку(Выборка, НомерГруппировки)

// Обойдем в цикле переданную выборку.
Пока Выборка.Следующий() Цикл
НазваниеГруппировки = Выборка.Группировка();

ЗначениеГруппировки = Выборка[НазваниеГруппировки];

Уровень = Выборка.Уровень();
ЭтоНеИтогПоИерархии = (Выборка.ТипЗаписи() <> ТипЗаписиЗапроса.ИтогПоИе� �архии);

ЭтоНижнийУровень = (НазваниеГруппировки = "Номенклатура" И ЭтоНеИтогПоИерархии);

Если мПоляСПредставлениями[НазваниеГруппировки] = Неопределено Тогда
ПредставлениеГруппировки = Выборка[НазваниеГруппировки];
Иначе
ПредставлениеГруппировки = Выборка[НазваниеГруппировки + "Представление"];
КонецЕсли;

// Если тип записи - это итог по иерархии,
// то для вывода будем использовать секции, предназначенные для иерархии.
Если ЭтоНижнийУровень Тогда
мНомерСтроки = мНомерСтроки + 1;

СекцияНачало = мСписокНачало;

СекцияНачало.Параметры.Ном ерСтроки = мНомерСтроки;

СекцияНоменклатура = мСписокНоменклатура;
СекцияДопПоле = мСписокДопПоле;
Иначе
СекцияНачало = мСписокГруппаНачало;
СекцияНоменклатура = мСписокГруппаНоменклатура ;
СекцияДопПоле = мСписокГруппаДопПоле;
КонецЕсли;

СекцияНоменклатура.Параме� �ры.Измерение = ПредставлениеГруппировки;

Если ЭтоНеИтогПоИерархии Тогда
СекцияНоменклатура.Параме� �ры.Расшифровка = ЗначениеГруппировки;
КонецЕсли;

// Если выведены все группировки верхних уровней,
// то выведем доп. поля.
Если ЭтоНижнийУровень Тогда
ВыборкаЕдиницыИзмерения = Выборка.Выбрать(ОбходРезул ьтатаЗапроса.ПоГруппировк� �м, "ЕдиницаИзмерения");
Пока ВыборкаЕдиницыИзмерения.С� �едующий() Цикл
мТабДок.Вывести(СекцияНача ло, Уровень, , Истина);

Если ВыборкаЕдиницыИзмерения.В� �с = 0 Тогда
мВесВведенНеДляВсехТоваро в = Истина;
Иначе
мИтогВес = мИтогВес + ВыборкаЕдиницыИзмерения.В� �с;
КонецЕсли;

Для Тмп = 1 По мСоответствиеДопПолейДо.К� �личество() Цикл
ВывестиПолеВОтчет(мСоотве� �ствиеДопПолейДо[Тмп], ВыборкаЕдиницыИзмерения, СекцияДопПоле);
КонецЦикла;

СтрокаДопПолейВместе = "";
Для Тмп = 1 По мКоличествоДопПолейВместе Цикл
Если Не ПустаяСтрока(Строка(Выборк аЕдиницыИзмерения[мСоответствиеДопПолейВмес те[Тмп]])) Тогда
Если ПустаяСтрока(СтрокаДопПол� �йВместе) Тогда
СтрокаДопПолейВместе = СтрокаДопПолейВместе + " (" + ВыборкаЕдиницыИзмерения[мСоответствиеДопПолейВмес те[Тмп]];
Иначе
СтрокаДопПолейВместе = СтрокаДопПолейВместе + ", " + ВыборкаЕдиницыИзмерения[мСоответствиеДопПолейВмес те[Тмп]];
КонецЕсли;
КонецЕсли;
КонецЦикла;

Если Не ПустаяСтрока(СтрокаДопПол� �йВместе) Тогда
СекцияНоменклатура.Параме� �ры.Измерение = Строка(СекцияНоменклатура. Параметры.Измерение) + СтрокаДопПолейВместе + ")";
КонецЕсли;

мТабДок.Присоединить(Секци яНоменклатура);

Для Тмп = 1 По мСоответствиеДопПолейПосл е.Количество() Цикл
ВывестиПолеВОтчет(мСоотве� �ствиеДопПолейПосле[Тмп], ВыборкаЕдиницыИзмерения, СекцияДопПоле);
КонецЦикла;
КонецЦикла;
Иначе
мТабДок.Вывести(СекцияНача ло, Уровень, , Истина);

// Для группировок верхних уровней и иерархии выведем
// пустые ячейки доп. полей.
Для Тмп = 1 По мСоответствиеДопПолейДо.К� �личество() Цикл
ВывестиПустоеПолеВОтчет(м� �оответствиеДопПолейДо[Тмп], Выборка, СекцияДопПоле);
КонецЦикла;

мТабДок.Присоединить(Секци яНоменклатура);

Для Тмп = 1 По мСоответствиеДопПолейПосл е.Количество() Цикл
ВывестиПустоеПолеВОтчет(м� �оответствиеДопПолейПосле[Тмп], Выборка, СекцияДопПоле);
КонецЦикла;

// Если тип записи не итог по иерархии,
// то нужно выбрать следующую группировку.
Если ЭтоНеИтогПоИерархии Тогда
ВывестиСтроку(Выборка.Выбр ать(ОбходРезультатаЗапрос� �.ПоГруппировкам, мСоответствиеГруппировок[НомерГруппировки + 1]), НомерГруппировки + 1);
КонецЕсли;
КонецЕсли;

КонецЦикла;

КонецПроцедуры // ВывестиСтроку()

Функция ВосстановитьНастройки() Экспорт

Перем СохраненнаяНастройка;

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

Результат = УниверсальныеМеханизмы.Во� �становлениеНастроек(Струк тураНастройки);
Если Результат <> Неопределено Тогда
мТекущаяНастройка = Результат;

ВосстановитьНастройкиИзСт руктуры(мТекущаяНастройка. СохраненнаяНастройка);
Иначе
мТекущаяНастройка = СтруктураНастройки;
КонецЕсли;

ОбновитьСохраненныеНастро йки();

КонецФункции // ВосстановитьНастройки()

// Процедура восстанавливает сохраненные настройки при открытии обработки.
//
Процедура ВосстановитьНастройкиПриО ткрытии() Экспорт

ЗаполнитьПостроительОтчет а();

СтруктураНастройки = Новый Структура;
СтруктураНастройки.Встави� �ь("Пользователь", глЗначениеПеременной("глТекущийПользователь"));
СтруктураНастройки.Встави� �ь("ИмяОбъекта" , Строка(ЭтотОбъект));

Если УниверсальныеМеханизмы.По� �учитьНастройкуИспользова� �ьПриОткрытии(СтруктураНас тройки) Тогда
мТекущаяНастройка = СтруктураНастройки;
ВосстановитьНастройкиИзСт руктуры(СтруктураНастройк� �.СохраненнаяНастройка);
КонецЕсли;

ОбновитьСохраненныеНастро йки();

КонецПроцедуры // ВосстановитьНастройкиПриО ткрытии()

// Заполняет настройки отчета из структуры сохраненных настроек
//
Функция ВосстановитьНастройкиИзСт руктуры(СтруктураСНастрой� �ами) Экспорт

Перем ТекНастройка;

Если СтруктураСНастройками.Сво� �ство("НастройкиПостроителя", ТекНастройка) Тогда
ПостроительОтчета.Установ� �тьНастройки(ТекНастройка);
КонецЕсли;

СтруктураСНастройками.Сво� �ство("ТаблицаНастройкиПолейПеча ть" , ТаблицаНастройкиПолейПеча ть);
СтруктураСНастройками.Сво� �ство("СписокСкладов" , СписокСкладов);
СтруктураСНастройками.Сво� �ство("ВыводитьЗаголовок" , ВыводитьЗаголовок);
СтруктураСНастройками.Сво� �ство("ПоказыватьФорму" , ПоказыватьФорму);
СтруктураСНастройками.Сво� �ство("ИспользоватьСвойства" , ИспользоватьСвойства);
СтруктураСНастройками.Сво� �ство("КоличествоУровнейМестХран ения" , КоличествоУровнейМестХран ения);
СтруктураСНастройками.Сво� �ство("ПредставленияПриоритетовМ естХранения", ПредставленияПриоритетовМ естХранения);

КонецФункции // ВосстановитьНастройкиИзСт руктуры()

Процедура СохранитьНастройки() Экспорт

Перем СохраненнаяНастройка;

СохраненнаяНастройка = Новый Структура;
СформироватьСтруктуруДляС охраненияНастроек(Сохране� �наяНастройка);

СтруктураНастройки = Новый Структура;
СтруктураНастройки.Встави� �ь("Пользователь", глЗначениеПеременной("глТекущийПользователь"));
СтруктураНастройки.Встави� �ь("ИмяОбъекта", Строка(ЭтотОбъект));
СтруктураНастройки.Встави� �ь("НаименованиеНастройки", ?(мТекущаяНастройка = Неопределено, Неопределено, мТекущаяНастройка.Наимено� �аниеНастройки));
СтруктураНастройки.Встави� �ь("СохраненнаяНастройка", СохраненнаяНастройка);
СтруктураНастройки.Встави� �ь("ИспользоватьПриОткрытии", Ложь);
СтруктураНастройки.Встави� �ь("СохранятьАвтоматически", Ложь);

Результат = УниверсальныеМеханизмы.Со� �ранениеНастроек(Структура Настройки);

Если Результат <> Неопределено Тогда
мТекущаяНастройка = Результат;
Иначе
мТекущаяНастройка = СтруктураНастройки;
КонецЕсли;

КонецПроцедуры // СохранитьНастройки()

// Процедура добавляет колонку в таблицу значений, если ее там нет.
// Параметры:
// ТЗ - таблица значений, в которую нужно добавить колонку;
// ИмяКолонки - имя колонки, которую нужно добавить.
Процедура ДобавитьКолонкуВТЗ(ТЗ, ИмяКолонки, ЗначениеПоУмолчанию = Неопределено)

Если ТЗ.Колонки.Найти(ИмяКолонк� �) = Неопределено Тогда
ТЗ.Колонки.Добавить(ИмяКол� �нки);
ТЗ.ЗаполнитьЗначения(Значе ниеПоУмолчанию, ИмяКолонки);
КонецЕсли;

КонецПроцедуры // ДобавитьКолонкуВТЗ()

// Процедура обновляет настройки после их восстановления.
//
Процедура ОбновитьСохраненныеНастро йки()

ДобавитьКолонкуВТЗ(Таблиц� �НастройкиПолейПечать, "Поле");
ДобавитьКолонкуВТЗ(Таблиц� �НастройкиПолейПечать, "Псевдоним");
ДобавитьКолонкуВТЗ(Таблиц� �НастройкиПолейПечать, "ВыводитьНаПечать");
ДобавитьКолонкуВТЗ(Таблиц� �НастройкиПолейПечать, "Положение");
ДобавитьКолонкуВТЗ(Таблиц� �НастройкиПолейПечать, "Имя");
ДобавитьКолонкуВТЗ(Таблиц� �НастройкиПолейПечать, "ПутьКДанным");
ДобавитьКолонкуВТЗ(Таблиц� �НастройкиПолейПечать, "Ширина");
ДобавитьКолонкуВТЗ(Таблиц� �НастройкиПолейПечать, "Выравнивание", ГоризонтальноеПоложение.А� �то);

ДобавитьКолонкуВТЗ(Предст� �вленияПриоритетовМестХра� �ения, "Приоритет");
ДобавитьКолонкуВТЗ(Предст� �вленияПриоритетовМестХра� �ения, "Псевдоним");

ОбновитьНастройкиПечати();

КонецПроцедуры // ОбновитьСохраненныеНастро йки()

// Обновляет таблицу с настройками вывода доп. полей на печать.
//
Процедура ОбновитьНастройкиПечати() Экспорт

КоличествоСтрок = ТаблицаНастройкиПолейПеча ть.Количество() - 1;
Для Тмп = 0 По КоличествоСтрок Цикл
СтрокаНастройки = ТаблицаНастройкиПолейПеча ть[КоличествоСтрок - Тмп];
Если ПостроительОтчета.Выбранн� �еПоля.Найти(СтрокаНастрой� �и.Имя) = Неопределено Тогда
ТаблицаНастройкиПолейПеча ть.Удалить(СтрокаНастройки );
КонецЕсли;
КонецЦикла;

Для Каждого Поле Из ПостроительОтчета.Выбранн� �еПоля Цикл
Если ТаблицаНастройкиПолейПеча ть.Найти(Поле.Имя, "Имя") = Неопределено Тогда
НоваяСтрока = ТаблицаНастройкиПолейПеча ть.Добавить();
НоваяСтрока.Поле = Поле.Представление;
НоваяСтрока.Псевдоним = Поле.Представление;
НоваяСтрока.ВыводитьНаПеч� �ть = Истина;
НоваяСтрока.Имя = Поле.Имя;
НоваяСтрока.ПутьКДанным = Поле.ПутьКДанным;
НоваяСтрока.Ширина = 14;
НоваяСтрока.Выравнивание = ГоризонтальноеПоложение.А� �то;

НоваяСтрока.Положение = мСписокПоложенийДляПечати[0].Значение;
КонецЕсли;
КонецЦикла;

КонецПроцедуры // ОбновитьНастройкиПечати()

// Процедура формирует печатную форму в соответствии с заданными настройками.
//
// Параметры:
//
//
Процедура Печать(НаПринтер = Ложь) Экспорт

Отказ = Ложь;

ПроверитьКорректностьНаст роек(Отказ);

Если Отказ Тогда
ФормаНастройки = ПолучитьФорму();
Если Не ФормаНастройки.Открыта() Тогда
мИнициализироватьНастройк иПриОткрытии = Ложь;
ФормаНастройки.Открыть();
КонецЕсли;
КонецЕсли;

Если Отказ Тогда
Возврат;
КонецЕсли;

РезультатЗапроса = ВыполнитьЗапрос(Новый Структура("НоменклатураПредставление , ЕдиницаИзмеренияПредставл ение, СкладПредставление"));

мТабДок = Новый ТабличныйДокумент;
мТабДок.ИмяПараметровПеча� �и = "Обработки.ПечатьРаскладки� �оменклатурыПоМестамХране� �ия";

мМакет = ПолучитьМакет("Макет");

Если ВыводитьЗаголовок Тогда // выведем заголовок
Секция = мМакет.ПолучитьОбласть("Заголовок");

Секция.Параметры.ТекстЗаго ловка = СокрЛП(Документ);
Секция.Параметры.Склад = СокрЛП(мСклад);
мТабДок.Вывести(Секция);
КонецЕсли;

ОбластьМакета = мМакет.ПолучитьОбласть("Покупатель");
ПредставлениеПолучателя = ФормированиеПечатныхФорм.� �писаниеОрганизации("ПолноеНаименование,");
ОбластьМакета.Параметры.Пр едставлениеПолучателя = ПредставлениеПолучателя;
мТабДок.Вывести(ОбластьМак ета);

Секция = мМакет.ПолучитьОбласть("ВремяПечати");
Секция.Параметры.ВремяПеча ти = "Дата и время печати: " + ТекущаяДата() + ". Пользователь: " + СокрЛП(глЗначениеПеременн� �й("глТекущийПользователь"));
мТабДок.Вывести(Секция);

Секция = мМакет.ПолучитьОбласть("Шапка|Начало");
мТабДок.Вывести(Секция);

Секция = мМакет.ПолучитьОбласть("Шапка|ДопПоле");

мКоличествоДопПолейДо = 0;
мСоответствиеДопПолейДо = Новый Соответствие;

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

мКоличествоДопПолейДо = мКоличествоДопПолейДо + ВывестиПолеВШапку(ДопПоле, РезультатЗапроса, Секция);
КонецЕсли;
КонецЦикла;

мКоличествоДопПолейВместе = 0;
мСоответствиеДопПолейВмес те = Новый Соответствие;

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

мКоличествоГруппировок = - 1;
мСоответствиеГруппировок = Новый Соответствие;

// Посчитаем группировок количество и запомним соответствие имен.
ТекстГруппировок = "";
Для Каждого ГруппировкаСтрок Из мИзмеренияСтроки Цикл
мКоличествоГруппировок = мКоличествоГруппировок + 1;
мСоответствиеГруппировок.� �ставить(мКоличествоГруппи ровок, ГруппировкаСтрок.Ключ);
КонецЦикла;

Секция = мМакет.ПолучитьОбласть("Шапка|Номенклатура");
мТабДок.Присоединить(Секци я);

Секция = мМакет.ПолучитьОбласть("Шапка|ДопПоле");

мКоличествоДопПолейПосле = 0;
мСоответствиеДопПолейПосл е = Новый Соответствие;

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

мКоличествоДопПолейПосле = мКоличествоДопПолейПосле + ВывестиПолеВШапку(ДопПоле, РезультатЗапроса, Секция);
КонецЕсли;
КонецЦикла;

мСписокНачало = мМакет.ПолучитьОбласть("Список|Начало");
мСписокНоменклатура = мМакет.ПолучитьОбласть("Список|Номенклатура");
мСписокДопПоле = мМакет.ПолучитьОбласть("Список|ДопПоле");

мСписокГруппаНачало = мМакет.ПолучитьОбласть("СписокГруппа|Начало");
мСписокГруппаНоменклатура = мМакет.ПолучитьОбласть("СписокГруппа|Номенклатура");
мСписокГруппаДопПоле = мМакет.ПолучитьОбласть("СписокГруппа|ДопПоле");

мНомерСтроки = 0;

МетаданныеДокумента = Метаданные.Документы[ВидДокументов];

ЕстьСоставНабора = ОбщегоНазначения.ЕстьТабЧ� �стьДокумента("СоставНабора", МетаданныеДокумента);

мИтогВес = 0;
мВесВведенНеДляВсехТоваро в = Ложь;

ВывестиСтроку(РезультатЗа� �роса.Выбрать(ОбходРезульт� �таЗапроса.ПоГруппировкам, мСоответствиеГруппировок[0]), 0);

ШиринаНоменклатура = мМакет.ПолучитьОбласть("Номенклатура").ШиринаТаблицы;
ШиринаНачало = мМакет.ПолучитьОбласть("Начало").ШиринаТаблицы;

ТекКолонка = ШиринаНачало + 1;
Для Тмп = 1 По мСоответствиеДопПолейДо.К� �личество() Цикл
ТекКолонка = ТекКолонка + УстановитьШиринуПолей(мСо� �тветствиеДопПолейДо[Тмп], РезультатЗапроса, ТекКолонка);
КонецЦикла;

ТекКолонка = ШиринаНачало + 1 + ШиринаНоменклатура + мКоличествоДопПолейДо;
Для Тмп = 1 По мСоответствиеДопПолейПосл е.Количество() Цикл
ТекКолонка = ТекКолонка + УстановитьШиринуПолей(мСо� �тветствиеДопПолейПосле[Тмп], РезультатЗапроса, ТекКолонка);
КонецЦикла;

Секция = мМакет.ПолучитьОбласть("ИтогоВес");
Секция.Параметры.ИтогВес = "Общий вес товаров: " + мИтогВес + " " + мЕдиницаИзмеренияВеса + "."
+ ?(мВесВведенНеДляВсехТовар ов, " Вес введен не для всех товаров.", "");
мТабДок.Вывести(Секция);

УниверсальныеМеханизмы.На� �ечататьДокумент(мТабДок, , НаПринтер, "Бланк товарного наполнения");

КонецПроцедуры // Печать()

// Сохраняет настройки построителя, добавляет служебные поля, получает результат,
// восстанавливает настройки.
//
// Параметры:
// СлужебныеПоля - структура со служебными полями.
//
// Возвращаемое значение - РезультатЗапроса.
//
Функция ВыполнитьЗапрос(Служебные� �оля)

Настройки = ПостроительОтчета.Получит� �Настройки();

ЗаполнитьПостроительОтчет а();
ПостроительОтчета.Установ� �тьНастройки(Настройки);

Для Каждого Поле Из СлужебныеПоля Цикл
ПостроительОтчета.Доступн� �еПоля.Найти(Поле.Ключ).Поле = Истина;
ПостроительОтчета.Выбранн� �еПоля.Добавить(Поле.Ключ);
КонецЦикла;

ПостроительОтчета.Доступн� �еПоля.Склад.Измерение = Истина;
ПостроительОтчета.Доступн� �еПоля.Приоритет.Измерение = Истина;
ПостроительОтчета.Доступн� �еПоля.ЕдиницаИзмерения.Из� �ерение = Истина;

ПостроительОтчета.Измерен� �яКолонки.Очистить();
ПостроительОтчета.Измерен� �яКолонки.Добавить("Приоритет" , ,ТипИзмеренияПостроителяО� �чета.Элементы);
ПостроительОтчета.Измерен� �яКолонки.Добавить("Склад" , ,ТипИзмеренияПостроителяО� �чета.Элементы);
ПостроительОтчета.Измерен� �яКолонки.Добавить("ЕдиницаИзмерения", ,ТипИзмеренияПостроителяО� �чета.Элементы);

мИзмеренияСтроки = Новый Структура;
Для Каждого ИзмерениеСтроки Из ПостроительОтчета.Измерен� �яСтроки Цикл
мИзмеренияСтроки.Вставить( ИзмерениеСтроки.Имя);
КонецЦикла;

РезультатЗапроса = ПостроительОтчета.Результ� �т;

ПостроительОтчета.Установ� �тьНастройки(Настройки);

ПостроительОтчета.Доступн� �еПоля.Склад.Измерение = Ложь;
ПостроительОтчета.Доступн� �еПоля.Приоритет.Измерение = Ложь;
ПостроительОтчета.Доступн� �еПоля.ЕдиницаИзмерения.Из� �ерение = Ложь;

Для Каждого Поле Из СлужебныеПоля Цикл
ПостроительОтчета.Доступн� �еПоля.Найти(Поле.Ключ).Поле = Ложь;
КонецЦикла;

Возврат РезультатЗапроса;

КонецФункции // ВыполнитьЗапрос()

// Функция возвращает массив складов для вывода остатков товаров.
//
// Возвращаемое значение:
// Массив - Массив складов для вывода остатков товаров.
//
Функция ПолучитьМассивСкладов()

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

Возврат МассивСкладов;

КонецФункции // ПолучитьМассивСкладов()

// Процедура заполняет построитель отчета.
//
// Параметры:
// ИмяМакета -Название макета, в который выводится печатная форма.
//
Процедура ЗаполнитьПостроительОтчет а(НеЗаполнятьНастройки = Ложь) Экспорт

МетаданныеДокумента = Метаданные.Документы[ВидДокументов];

ИмяДокумента = МетаданныеДокумента.Имя;

Если мИмяМакета = Неопределено И ОбщегоНазначения.ЕстьРекв� �зитДокумента("СкладОтправитель", МетаданныеДокумента) Тогда
мИмяМакета = "БланкОтправитель";
КонецЕсли;

Если ОбщегоНазначения.ЕстьРекв� �зитДокумента("Склад", МетаданныеДокумента) Тогда
мИмяРеквизитаСклад = "Склад";
ИначеЕсли ОбщегоНазначения.ЕстьРекв� �зитДокумента("СкладОрдер", МетаданныеДокумента) Тогда
мИмяРеквизитаСклад = "СкладОрдер";
ИначеЕсли ОбщегоНазначения.ЕстьРекв� �зитДокумента("СкладГруппа", МетаданныеДокумента) Тогда
мИмяРеквизитаСклад = "СкладГруппа";
ИначеЕсли мИмяМакета = "БланкОтправитель"
И ОбщегоНазначения.ЕстьРекв� �зитДокумента("СкладОтправитель", МетаданныеДокумента) Тогда
мИмяРеквизитаСклад = "СкладОтправитель";
ИначеЕсли мИмяМакета = "БланкПолучатель"
И ОбщегоНазначения.ЕстьРекв� �зитДокумента("СкладПолучатель", МетаданныеДокумента) Тогда
мИмяРеквизитаСклад = "СкладПолучатель";
КонецЕсли;

мСклад = Документ[мИмяРеквизитаСклад];

ЕстьСкладВТабЧасти = ОбщегоНазначения.ЕстьРекв� �зитТабЧастиДокумента("Склад", МетаданныеДокумента, "Товары");
ЕстьСоставНабора = ОбщегоНазначения.ЕстьТабЧ� �стьДокумента("СоставНабора", МетаданныеДокумента);

Если ОбщегоНазначения.ЕстьРекв� �зитДокумента("Сделка", МетаданныеДокумента) Тогда
ДокументРезерва = Документ.Сделка;
Иначе
ДокументРезерва = Документы.ЗаказПокупателя. ПустаяСсылка();
КонецЕсли;

ПостроительОтчета.Парамет� �ы.Вставить("ТекДокумент" , Документ);
ПостроительОтчета.Парамет� �ы.Вставить("МассивСклады" , ПолучитьМассивСкладов());
ПостроительОтчета.Парамет� �ы.Вставить("ДокументРезерва", ДокументРезерва);

// Текст запроса для отбора по номенклатуре.
ТекстЗапросаНоменклатура = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
|";

Если ЕстьСоставНабора Тогда
ТекстЗапросаНоменклатура = ТекстЗапросаНоменклатура + "
| ЕСТЬNULL(ДокСостав.Номенклат ура, Док.Номенклатура) КАК Номенклатура
|";
Иначе
ТекстЗапросаНоменклатура = ТекстЗапросаНоменклатура + "
| Док.Номенклатура КАК Номенклатура
|";
КонецЕсли;

ТекстЗапросаНоменклатура = ТекстЗапросаНоменклатура + "
|ИЗ
| Документ." + ИмяДокумента + ".Товары КАК Док
|";

Если ЕстьСоставНабора Тогда
ТекстЗапросаНоменклатура = ТекстЗапросаНоменклатура + "
|ЛЕВОЕ СОЕДИНЕНИЕ
| Документ." + ИмяДокумента + ".СоставНабора КАК ДокСостав
|ПО
| ДокСостав.Ссылка = Док.Ссылка
| И ДокСостав.КлючСтроки = Док.КлючСтроки
|";
КонецЕсли;

ТекстЗапросаНоменклатура = ТекстЗапросаНоменклатура + "
|ГДЕ
| Док.Ссылка = &ТекДокумент
| " + ?(ТолькоНеотсканированныйТ овар, "И Док.Количество <> Док.КоличествоОтсканирова� �ного", "") + "
|";

ТекстРодительМестаХранени я = "";
Для Тмп = 1 По КоличествоУровнейМестХран ения - 1 Цикл
ТекстРодительМестаХранени я = ТекстРодительМестаХранени я + ".Родитель";
КонецЦикла;

ДокументПроведен = Документ.Проведен;

ТекстЗапроса = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЗапросАдрес.*
|//СВОЙСТВА
|//ПРЕДСТАВЛЕНИЯ_СВОЙСТВА
|ИЗ
| (ВЫБРАТЬ
| ОсновнаяТаблица.Номенклат� �ра КАК Номенклатура,
| ОсновнаяТаблица.Номенклат� �ра.Наименование КАК НоменклатураПредставление ,
| ОсновнаяТаблица.ЕдиницаИз� �ерения КАК ЕдиницаИзмерения,
| ОсновнаяТаблица.ЕдиницаИз� �ерения.Наименование КАК ЕдиницаИзмеренияПредставл ение,
| ОсновнаяТаблица.ЕдиницаИз� �ерения.Вес * ОсновнаяТаблица.Количеств� � КАК Вес,
| ОсновнаяТаблица.Склад КАК СкладОтгрузкиОприходовани я,
| ОсновнаяТаблица.Количеств� � КАК Количество,
| ЕСТЬNULL(РегМестаХраненияОс� �овной.МестоХранения" + ТекстРодительМестаХранени я + ", """") КАК МестоХраненияРодитель,
| ЕСТЬNULL(РегМестаХранения.Ме стоХранения.Наименование, """") КАК МестоХранения,
| ЕСТЬNULL(РегМестаХранения.Пр иоритет, 0) КАК Приоритет,
| СпрСклады.Ссылка КАК Склад,
| СпрСклады.Наименование КАК СкладПредставление,
| ВЫРАЗИТЬ(((ЕСТЬNULL(ТоварыНаС кладах.КоличествоОстаток, 0)
| - ЕСТЬNULL(ТоварыВРезервеНаСк� �адах.КоличествоОстаток, 0)
| - ЕСТЬNULL(ТоварыКПередачеСоС� �ладов.КоличествоОстаток, 0)
| + ЕСТЬNULL(РезервыПоЗаказу.Кол ичествоОстаток, 0)
|" + ?(ДокументПроведен, "
// Движения по документу.
| + ЕСТЬNULL(ТоварыНаСкладахПоД� �кументу.Количество, 0)
| - ЕСТЬNULL(ТоварыВРезервеНаСк� �адахПоДокументу.Количеств о, 0)
| - ЕСТЬNULL(ТоварыКПередачеСоС� �ладовПоДокументу.Количест во, 0)", "") + "
| ) * ОсновнаяТаблица.Номенклат� �ра.ЕдиницаХраненияОстатко в.Коэффициент
| / ОсновнаяТаблица.ЕдиницаИз� �ерения.Коэффициент) КАК ЧИСЛО(15, 3)) КАК Остаток
| ИЗ
| (ВЫБРАТЬ
| ДокИсточникПервичный.Скла� � КАК Склад,
| ДокИсточникПервичный.Номе� �клатура КАК Номенклатура,
| ДокИсточникПервичный.Един� �цаИзмерения КАК ЕдиницаИзмерения,
| ДокИсточникПервичный.Коли� �ество КАК Количество,
| МИНИМУМ(ЕСТЬNULL(РегМестаХра нения.Приоритет, 0)) КАК МинПриоритет
| ИЗ
| (ВЫБРАТЬ
| " + ?(ЕстьСкладВТабЧасти, "ТЧТовары.Склад", "Документ." + мИмяРеквизитаСклад) + " КАК Склад,";

Если ЕстьСоставНабора Тогда
ТекстЗапроса = ТекстЗапроса + "
| ЕСТЬNULL(ТЧСоставНабора.Номе нклатура, ТЧТовары.Номенклатура) КАК Номенклатура,
| ЕСТЬNULL(ТЧСоставНабора.Един ицаИзмерения, ТЧТовары.ЕдиницаИзмерения) КАК ЕдиницаИзмерения,
| СУММА(ЕСТЬNULL(ТЧСоставНабор а.Количество * ТЧТовары.Количество"
+ ?(ТолькоНеотсканированныйТ овар, " - ТЧСоставНабора.Количество� �тсканированного", "")
+ ", ТЧТовары.Количество" + ?(ТолькоНеотсканированныйТ овар, " - ТЧТовары.КоличествоОтскан� �рованного", "") + ")) КАК Количество
|";
Иначе
ТекстЗапроса = ТекстЗапроса + "
| ТЧТовары.Номенклатура КАК Номенклатура,
| ТЧТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| СУММА(ТЧТовары.Количество" + ?(ТолькоНеотсканированныйТ овар, " - ТЧТовары.КоличествоОтскан� �рованного", "") + ") КАК Количество
|";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса + "
| ИЗ
| Документ." + ИмяДокумента + " КАК Документ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ." + ИмяДокумента + ".Товары КАК ТЧТовары
| ПО ТЧТовары.Ссылка = Документ.Ссылка";


Если ЕстьСоставНабора Тогда
ТекстЗапроса = ТекстЗапроса + "
| ЛЕВОЕ СОЕДИНЕНИЕ Документ." + ИмяДокумента + ".СоставНабора КАК ТЧСоставНабора
| ПО ТЧСоставНабора.Ссылка = Документ.Ссылка
| И ТЧСоставНабора.КлючСтроки = ТЧТовары.КлючСтроки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
| ПО (СправочникНоменклатура.Сс ылка = ТЧТовары.Номенклатура)";
Иначе
ТекстЗапроса = ТекстЗапроса + "
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
| ПО (СправочникНоменклатура.Сс ылка = ТЧТовары.Номенклатура)";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса + "
| ГДЕ
| Документ.Ссылка В(&ТекДокумент)
| " + ?(ТолькоНеотсканированныйТ овар, "И ТЧТовары.Количество <> ТЧТовары.КоличествоОтскан� �рованного", "") + "
|
| СГРУППИРОВАТЬ ПО
| " + ?(ЕстьСкладВТабЧасти, "ТЧТовары.Склад", "Документ." + мИмяРеквизитаСклад) + ",";

Если ЕстьСоставНабора Тогда
ТекстЗапроса = ТекстЗапроса + "
| ЕСТЬNULL(ТЧСоставНабора.Номе нклатура, ТЧТовары.Номенклатура),
| ЕСТЬNULL(ТЧСоставНабора.Един ицаИзмерения, ТЧТовары.ЕдиницаИзмерения) ) КАК ДокИсточникПервичный";
Иначе
ТекстЗапроса = ТекстЗапроса + "
| """",
| ТЧТовары.Номенклатура,
| ТЧТовары.ЕдиницаИзмерения) КАК ДокИсточникПервичный";
КонецЕсли;

ТекстЗапроса = ТекстЗапроса + "
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестаХран� �нияНоменклатуры КАК РегМестаХранения
| ПО РегМестаХранения.Номенкла� �ура = ДокИсточникПервичный.Номе� �клатура
| И РегМестаХранения.Склад = ДокИсточникПервичный.Скла� �
|
| СГРУППИРОВАТЬ ПО
| ДокИсточникПервичный.Скла� �,
| ДокИсточникПервичный.Номе� �клатура,
| ДокИсточникПервичный.Един� �цаИзмерения,
| ДокИсточникПервичный.Коли� �ество) КАК ОсновнаяТаблица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестаХран� �нияНоменклатуры КАК РегМестаХранения
| ПО РегМестаХранения.Номенкла� �ура = ОсновнаяТаблица.Номенклат� �ра
| И РегМестаХранения.Склад = ОсновнаяТаблица.Склад
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестаХран� �нияНоменклатуры КАК РегМестаХраненияОсновной
| ПО РегМестаХраненияОсновной.� �оменклатура = ОсновнаяТаблица.Номенклат� �ра
| И РегМестаХраненияОсновной.� �клад = ОсновнаяТаблица.Склад
| И РегМестаХраненияОсновной.� �риоритет = ОсновнаяТаблица.МинПриори� �ет
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК СпрСклады
| ПО (СпрСклады.Ссылка В (&МассивСклады))
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыН� �Складах.Остатки(, Склад В (&МассивСклады)
| И Номенклатура В (" + ТекстЗапросаНоменклатура + ")) КАК ТоварыНаСкладах
| ПО ТоварыНаСкладах.Склад = СпрСклады.Ссылка
| И ТоварыНаСкладах.Номенклат� �ра = ОсновнаяТаблица.Номенклат� �ра
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВ� �езервеНаСкладах.Остатки(, Склад В (&МассивСклады)
| И Номенклатура В (" + ТекстЗапросаНоменклатура + ")) КАК ТоварыВРезервеНаСкладах
| ПО ТоварыВРезервеНаСкладах.С� �лад = СпрСклады.Ссылка
| И ТоварыВРезервеНаСкладах.Н� �менклатура = ОсновнаяТаблица.Номенклат� �ра
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыК� �ередачеСоСкладов.Остатки(, Склад В (&МассивСклады)
| И Номенклатура В (" + ТекстЗапросаНоменклатура + ")) КАК ТоварыКПередачеСоСкладов
| ПО ТоварыКПередачеСоСкладов.� �клад = СпрСклады.Ссылка
| И ТоварыКПередачеСоСкладов.� �оменклатура = ОсновнаяТаблица.Номенклат� �ра
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВ� �езервеНаСкладах.Остатки(,
| ДокументРезерва = &ДокументРезерва) КАК РезервыПоЗаказу
| ПО РезервыПоЗаказу.Номенклат� �ра = ОсновнаяТаблица.Номенклат� �ра
| И РезервыПоЗаказу.Склад = СпрСклады.Ссылка
|" + ?(ДокументПроведен, "
// Движения по документу.
| ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| ТоварыНаСкладах.Номенклат� �ра КАК Номенклатура,
| ТоварыНаСкладах.Склад КАК Склад,
| СУММА(ВЫБОР КОГДА ТоварыНаСкладах.ВидДвижен� �я = ЗНАЧЕНИЕ(ВидДвиженияНакоп� �ения.Приход) ТОГДА
| -ТоварыНаСкладах.Количеств� �
| ИНАЧЕ
| ТоварыНаСкладах.Количеств� �
| КОНЕЦ) КАК Количество
| ИЗ
| РегистрНакопления.ТоварыН� �Складах КАК ТоварыНаСкладах
| ГДЕ
| ТоварыНаСкладах.Регистрат� �р = &ТекДокумент
| СГРУППИРОВАТЬ ПО
| ТоварыНаСкладах.Номенклат� �ра,
| ТоварыНаСкладах.Склад
| ) КАК ТоварыНаСкладахПоДокумент у
| ПО ТоварыНаСкладахПоДокумент у.Склад = СпрСклады.Ссылка
| И ТоварыНаСкладахПоДокумент у.Номенклатура = ОсновнаяТаблица.Номенклат� �ра
| ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| ТоварыВРезервеНаСкладах.Н� �менклатура КАК Номенклатура,
| ТоварыВРезервеНаСкладах.С� �лад КАК Склад,
| СУММА(ВЫБОР КОГДА ТоварыВРезервеНаСкладах.В� �дДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакоп� �ения.Приход) ТОГДА
| -ТоварыВРезервеНаСкладах.К� �личество
| ИНАЧЕ
| ТоварыВРезервеНаСкладах.К� �личество
| КОНЕЦ) КАК Количество
| ИЗ
| РегистрНакопления.ТоварыВ� �езервеНаСкладах КАК ТоварыВРезервеНаСкладах
| ГДЕ
| ТоварыВРезервеНаСкладах.Р� �гистратор = &ТекДокумент
| СГРУППИРОВАТЬ ПО
| ТоварыВРезервеНаСкладах.Н� �менклатура,
| ТоварыВРезервеНаСкладах.С� �лад
| ) КАК ТоварыВРезервеНаСкладахПо Документу
| ПО ТоварыВРезервеНаСкладахПо Документу.Склад = СпрСклады.Ссылка
| И ТоварыВРезервеНаСкладахПо Документу.Номенклатура = ОсновнаяТаблица.Номенклат� �ра
| ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| ТоварыКПередачеСоСкладов.� �оменклатура КАК Номенклатура,
| ТоварыКПередачеСоСкладов.� �клад КАК Склад,
| СУММА(ВЫБОР КОГДА ТоварыКПередачеСоСкладов.� �идДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакоп� �ения.Приход) ТОГДА
| -ТоварыКПередачеСоСкладов.� �оличество
| ИНАЧЕ
| ТоварыКПередачеСоСкладов.� �оличество
| КОНЕЦ) КАК Количество
| ИЗ
| РегистрНакопления.ТоварыК� �ередачеСоСкладов КАК ТоварыКПередачеСоСкладов
| ГДЕ
| ТоварыКПередачеСоСкладов.� �егистратор = &ТекДокумент
| СГРУППИРОВАТЬ ПО
| ТоварыКПередачеСоСкладов.� �оменклатура,
| ТоварыКПередачеСоСкладов.� �клад
| ) КАК ТоварыКПередачеСоСкладовП оДокументу
| ПО ТоварыКПередачеСоСкладовП оДокументу.Склад = СпрСклады.Ссылка
| И ТоварыКПередачеСоСкладовП оДокументу.Номенклатура = ОсновнаяТаблица.Номенклат� �ра", "") + "
|) КАК ЗапросАдрес
|//СОЕДИНЕНИЯ
|УПОРЯДОЧИТЬ ПО
| МестоХраненияРодитель,
| Приоритет,
| МестоХранения
|ИТОГИ
//| МИНИМУМ(ЕдиницаИзмерения),
| СРЕДНЕЕ(Вес),
| СРЕДНЕЕ(Количество),
| МИНИМУМ(МестоХранения),
| СРЕДНЕЕ(Остаток),
| МИНИМУМ(НоменклатураПредс� �авление),
| МИНИМУМ(ЕдиницаИзмеренияП� �едставление),
| МИНИМУМ(СкладПредставлени� �)
|//ИТОГИ
|ПО
| СкладОтгрузкиОприходовани я,
| МестоХраненияРодитель,
| Номенклатура,
| Склад,
| Приоритет,
| ЕдиницаИзмерения
|//ОБЩИЕ_СВОЙСТВА
|АВТОУПОРЯДОЧИВАНИЕ";

// Соответствие имен полей в запросе и их представлений в отчете.
СтруктураПредставлениеПол ей = Новый Структура(
"Номенклатура, ЕдиницаИзмерения, Остаток, МестоХранения , МестоХраненияРодитель, СкладОтгрузкиОприходовани я",
"Номенклатура", "Ед. изм.", "Cвободный остаток", "Место хранения", "Родитель мест хранения", "Склад отгрузки (оприходования)");

Если ИспользоватьСвойства Тогда
ТекстПоляСвойств = "";

ТаблицаПолей = Новый ТаблицаЗначений;
ТаблицаПолей.Колонки.Добав ить("ПутьКДанным"); // описание поля запроса поля, для которого добавляются свойства. Используется в условии соединения с регистром сведений, хранящим значения свойств.
ТаблицаПолей.Колонки.Добав ить("Представление");// представление поля, для которого добавляются свойства.
ТаблицаПолей.Колонки.Добав ить("Назначение"); // назначение свойств объектов для данного поля.
ТаблицаПолей.Колонки.Добав ить("ТипЗначения"); // тип значения поля, для которого добавляются свойства. Используется, если не установлено назначение.

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

ТекСоответствиеНазначений = Новый Соответствие;

ДобавитьВТекстСвойстваЛок ально(ТаблицаПолей, ТекстЗапроса, СтруктураПредставлениеПол ей,
ТекСоответствиеНазначений , ПостроительОтчета.Парамет� �ы, , , ТекстПоляСвойств);

УправлениеОтчетами.Добави� �ьВТекстСВойстваОбщие(Текс тЗапроса, ТекстПоляСвойств, "//ОБЩИЕ_СВОЙСТВА");
КонецЕсли;

ПостроительОтчета.Текст = ТекстЗапроса;

Если НеЗаполнятьНастройки Тогда
Возврат;
КонецЕсли;

ПостроительОтчета.Заполни� �ьНастройки();

// Создадим список полей, доступных для выбора.
СоответствиеДоступныхПоле й = Новый Соответствие;
СоответствиеДоступныхПоле й.Вставить("ЕдиницаИзмерения", 0);
СоответствиеДоступныхПоле й.Вставить("Остаток" , 0);
СоответствиеДоступныхПоле й.Вставить("МестоХранения" , 0);
СоответствиеДоступныхПоле й.Вставить("Количество" , 0);
СоответствиеДоступныхПоле й.Вставить("Вес" , 0);
СоответствиеДоступныхПоле й.Вставить("Номенклатура" , 0);

Для Каждого ДоступноеПоле Из ПостроительОтчета.Доступн� �еПоля Цикл
Если СоответствиеДоступныхПоле й[ДоступноеПоле.Имя] = Неопределено
И Найти(ДоступноеПоле.Имя, "Свойство") = 0 Тогда
ДоступноеПоле.Поле = Ложь;
Иначе
ДоступноеПоле.Поле = Истина;
КонецЕсли;
КонецЦикла;

ПостроительОтчета.Доступн� �еПоля.Склад.Измерение = Ложь;
ПостроительОтчета.Доступн� �еПоля.Приоритет.Измерение = Ложь;
ПостроительОтчета.Доступн� �еПоля.ЕдиницаИзмерения.Из� �ерение = Ложь;

ПостроительОтчета.Измерен� �яСтроки.Очистить();
ПостроительОтчета.Измерен� �яСтроки.Добавить("СкладОтгрузкиОприходовани я", ,ТипИзмеренияПостроителяО� �чета.Элементы);
ПостроительОтчета.Измерен� �яСтроки.Добавить("МестоХраненияРодитель", ,ТипИзмеренияПостроителяО� �чета.Элементы);
ПостроительОтчета.Измерен� �яСтроки.Добавить("Номенклатура", ,ТипИзмеренияПостроителяО� �чета.Элементы);

ПостроительОтчета.Выбранн� �еПоля.Очистить();
ПостроительОтчета.Выбранн� �еПоля.Добавить("Количество");
ПостроительОтчета.Выбранн� �еПоля.Добавить("ЕдиницаИзмерения");
ПостроительОтчета.Выбранн� �еПоля.Добавить("МестоХранения");
ПостроительОтчета.Выбранн� �еПоля.Добавить("Остаток");
ПостроительОтчета.Выбранн� �еПоля.Добавить("Вес");

Если ИспользоватьСвойства Тогда
УправлениеОтчетами.Устано� �итьТипыЗначенийСвойствИК� �тегорийДляОтбора(Построит ельОтчета, , ТекстПоляСвойств, ТекСоответствиеНазначений , СтруктураПредставлениеПол ей);
КонецЕсли;

// Вызовем стандартную процедуру заполнения представлений.
УправлениеОтчетами.Заполн� �тьПредставленияПолей(Стру ктураПредставлениеПолей, ПостроительОтчета);

КонецПроцедуры // ЗаполнитьПостроительОтчет а()

мТекущаяНастройка = Новый Структура;
мТекущаяНастройка.Вставит� �("ИмяОбъекта" , Строка(ЭтотОбъект));
мТекущаяНастройка.Вставит� �("Пользователь" , глЗначениеПеременной("глТекущийПользователь"));
мТекущаяНастройка.Вставит� �("НаименованиеНастройки" , "");
мТекущаяНастройка.Вставит� �("ИспользоватьПриОткрытии", Ложь);
мТекущаяНастройка.Вставит� �("СохранятьАвтоматически" , Ложь);
мТекущаяНастройка.Вставит� �("СохраненнаяНастройка" , Неопределено);

мСпециальныеПоля = Новый Соответствие;
мСпециальныеПоля.Вставить("МестоХранения", 0);
мСпециальныеПоля.Вставить("Остаток" , 1);

мИнициализироватьНастройк иПриОткрытии = Истина;

мСписокПоложенийДляПечати = Новый СписокЗначений;
мСписокПоложенийДляПечати .Добавить("После номенклатуры");
мСписокПоложенийДляПечати .Добавить("До номенклатуры");
мСписокПоложенийДляПечати .Добавить("Вместе с номенклатурой");

мЕдиницаИзмеренияВеса = СокрЛП(Константы.ЕдиницаИз меренияВеса.Получить());

мПоляСПредставлениями = Новый Соответствие;
мПоляСПредставлениями.Вст� �вить("Номенклатура" , 0);
мПоляСПредставлениями.Вст� �вить("ЕдиницаИзмерения", 1);
мПоляСПредставлениями.Вст� �вить("Склад" , 2);

#КонецЕсли

Poluk
17.01.2014, 14:08
что бы полностью разобраться во всем и перевести обработку на 8.3 необходимо значительное время. Могу заняться этим, но только в рамках своей профессиональной деятельности. Если интересно, то обращайтесь в личку.

medved_kot
20.01.2014, 15:17
Спасибо, что откликнулись, сделала, как сказали убрали кавычки. Теперь другая проблема, пишет Не удалось определить значение параметра организации: ПолноеНаименование, ИНН, ОГРН и тд

Интересно кто-то прочитал вдумчиво эту "простыню".

Poluk
20.01.2014, 15:27
)))) Ага, и еще при этом разобрался почему ошибки вылетают...)