1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
| #Если Клиент Тогда
// Процедура заполняет построитель отчета.
//
Процедура ЗаполнитьПостроительОтчета() Экспорт
ТекстЗапроса = "
|ВЫБРАТЬ
| ИСТИНА КАК Печать,
| СпрНоменклатура.Номенклатура КАК Номенклатура,
| СпрНоменклатура.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| СпрНоменклатура.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
| 0 КАК Цена,
| 1 КАК Количество
|ИЗ
| (ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Номенклатура,
| ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры
| ИЗ
| Справочник.Номенклатура КАК СпрНоменклатура
| ГДЕ НЕ СпрНоменклатура.ЭтоГруппа
| {ГДЕ
| СпрНоменклатура.Ссылка.* КАК Номенклатура}
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| СпрХарактеристики.Владелец,
| СпрХарактеристики.Ссылка
| ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК СпрХарактеристики
| {ГДЕ
| СпрХарактеристики.Владелец.* КАК Номенклатура,
| СпрХарактеристики.Ссылка.* КАК ХарактеристикаНоменклатуры}
| ) КАК СпрНоменклатура
|";
Если ТолькоИмеющиесяВНаличии Тогда
ТекстЗапроса = ТекстЗапроса + "
|ЛЕВОЕ СОЕДИНЕНИЕ
| (ВЫБРАТЬ
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры,
| СУММА(НаСкладе.Количество) КАК Количество
| ИЗ
| (ВЫБРАТЬ
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры,
| НаСкладе.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК НаСкладе
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| ВРознице.Номенклатура,
| ВРознице.ХарактеристикаНоменклатуры,
| ВРознице.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыВРознице.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК ВРознице
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| ВНТТ.Номенклатура,
| ВНТТ.ХарактеристикаНоменклатуры,
| ВНТТ.КоличествоОстаток КАК Количество
| ИЗ
| РегистрНакопления.ТоварыВНТТ.Остатки(, {Номенклатура.* КАК Номенклатура,
| ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| Склад.* КАК Склад}) КАК ВНТТ
| ) КАК НаСкладе
| СГРУППИРОВАТЬ ПО
| НаСкладе.Номенклатура,
| НаСкладе.ХарактеристикаНоменклатуры
| ) КАК НаСкладе
|ПО
| СпрНоменклатура.Номенклатура = НаСкладе.Номенклатура
| И СпрНоменклатура.ХарактеристикаНоменклатуры = НаСкладе.ХарактеристикаНоменклатуры
|ГДЕ
| ЕСТЬNULL(НаСкладе.Количество, 0) > 0
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|УПОРЯДОЧИТЬ ПО
| СпрНоменклатура.Номенклатура.Наименование,
| СпрНоменклатура.ХарактеристикаНоменклатуры.Наименование
|";
// Соответствие имен полей в запросе и их представлений в отчете.
СтруктураПредставлениеПолей = Новый Структура(
"Номенклатура, ХарактеристикаНоменклатуры, Склад",
"Номенклатура", "Характеристика номенклатуры", "Склад");
ПостроительОтчета.Текст = ТекстЗапроса;
ПостроительОтчета.ЗаполнитьНастройки();
// Создадим список доступных отборов.
СоответствиеДоступныхОтборов = Новый Соответствие;
СоответствиеДоступныхОтборов.Вставить("Номенклатура", 0);
СоответствиеДоступныхОтборов.Вставить("ХарактеристикаНоменклатуры", 0);
СоответствиеДоступныхОтборов.Вставить("Склад", 0);
Для Каждого ДоступноеПоле Из ПостроительОтчета.ДоступныеПоля Цикл
Если СоответствиеДоступныхОтборов[ДоступноеПоле.Имя] =Неопределено Тогда
ДоступноеПоле.Отбор = Ложь;
Иначе
ДоступноеПоле.Отбор = Истина;
КонецЕсли;
КонецЦикла;
// Создадим массив отборов.
МассивОтбора = Новый Массив;
МассивОтбора.Добавить("Номенклатура");
МассивОтбора.Добавить("ХарактеристикаНоменклатуры");
Если ТолькоИмеющиесяВНаличии Тогда
МассивОтбора.Добавить("Склад");
КонецЕсли;
Для Каждого ЭлементОтбора Из МассивОтбора Цикл
Если ПостроительОтчета.Отбор.Найти(ЭлементОтбора) = Неопределено Тогда
ПостроительОтчета.Отбор.Добавить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;
// Вызовем стандартную процедуру заполнения представлений.
УправлениеОтчетами.ЗаполнитьПредставленияПолей(СтруктураПредставлениеПолей, ПостроительОтчета);
КонецПроцедуры // ЗаполнитьПостроительОтчета()
// Процедура перезаполняет цены в табличной части.
//
Процедура ПерезаполнитьЦены() Экспорт
СтруктураЗначений = Новый Структура;
СтруктураЗначений.Вставить("НовыйТипЦен", ТипЦен);
ЗапросПоЦенам = Ценообразование.СформироватьЗапросПоЦенам(СтруктураЗначений,
Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры,
Товары.ВыгрузитьКолонку("Номенклатура"),
РабочаяДата,
Неопределено).Выгрузить();
ЗапросПоЦенам.Индексы.Добавить("Номенклатура");
ПустаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
ТипЦенРассчитывается = ТипЦен.Рассчитывается;
СтруктураКурса = МодульВалютногоУчета.ПолучитьКурсВалюты(Валюта, РабочаяДата);
Курс = СтруктураКурса.Курс;
Кратность = СтруктураКурса.Кратность;
Для Каждого СтрокаТовара Из Товары Цикл
ХарактеристикаНоменклатуры = СтрокаТовара.ХарактеристикаНоменклатуры;
СтруктураПоиска = Новый Структура("Номенклатура", СтрокаТовара.Номенклатура);
СтрокиЦен = ЗапросПоЦенам.НайтиСтроки(СтруктураПоиска);
СтрокаБезХарактеристики = Неопределено;
СтрокаСХарактеристикой = Неопределено;
Для Каждого СтрокаЦен Из СтрокиЦен Цикл
Если СтрокаЦен.ХарактеристикаНоменклатуры = ПустаяХарактеристика Тогда
СтрокаБезХарактеристики = СтрокаЦен;
ИначеЕсли СтрокаЦен.ХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры Тогда
СтрокаСХарактеристикой = СтрокаЦен;
КонецЕсли;
КонецЦикла;
Если СтрокаСХарактеристикой <> Неопределено Тогда
НайденнаяСтрока = СтрокаСХарактеристикой;
ИначеЕсли СтрокаБезХарактеристики <> Неопределено Тогда
НайденнаяСтрока = СтрокаБезХарактеристики;
Иначе
НайденнаяСтрока = Неопределено;
КонецЕсли;
Если (НайденнаяСтрока <> Неопределено) И (НайденнаяСтрока.Цена <> 0) Тогда
Цена = НайденнаяСтрока.Цена * (1 + ?(ТипЦенРассчитывается, НайденнаяСтрока.ПроцентСкидкиНаценки / 100, 0));
Цена = Ценообразование.ОкруглитьЦену(Цена, ТипЦен.ПорядокОкругления, ТипЦен.ОкруглятьВБольшуюСторону);
Цена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(Цена, НайденнаяСтрока.ВалютаЦены, Валюта, Курс, Кратность);
СтрокаТовара.ЕдиницаИзмерения = НайденнаяСтрока.ЕдиницаИзмеренияЦены;
Иначе
Цена = 0;
КонецЕсли;
СтрокаТовара.Цена = Цена;
КонецЦикла;
КонецПроцедуры // ПерезаполнитьЦены()
// Функция формирует табличный документ - печатная форма ценника.
//
// Возвращаемое значение:
// ТабличныйДокумент - сформированный табличный документ или Неопределено, если есть ошибки.
//
Функция ПечатьЦенника() Экспорт
Если НЕ ЗначениеЗаполнено(Организация) Тогда
Предупреждение("Не выбрана организация!");
Возврат Неопределено;
КонецЕсли;
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Ценник";
Макет = ПолучитьМакет("Ценник");
ОбластьЦенника = Макет.ПолучитьОбласть("Строка|Столбец");
ДатаПечати = РабочаяДата;
ТекСтолбец = 0;
ТекСтрока = 0;
Для Каждого СтрокаТаблицы Из Товары Цикл
Если СтрокаТаблицы.Печать Тогда
Для Тмп = 1 По СтрокаТаблицы.Количество Цикл
ОбластьЦенника.Параметры.Заполнить(СтрокаТаблицы);
ОбластьЦенника.Параметры.НоменклатураНаименование = СтрокаТаблицы.Номенклатура.НаименованиеПолное;
ОбластьЦенника.Параметры.ХарактеристикаНаименование = СтрокаТаблицы.Номенклатура.Артикул;
ОбластьЦенника.Параметры.ЕдиницаНаименование = СтрокаТаблицы.ЕдиницаИзмерения;
ОбластьЦенника.Параметры.Цена = ОбщегоНазначения.ФорматСумм(СтрокаТаблицы.Цена, Валюта, "00");
ОбластьЦенника.Параметры.ДатаПечати = ДатаПечати;
ОбластьЦенника.Параметры.Организация = Организация;
ОбластьЦенника.Параметры.ОрганизацияНаименование = Организация;
//ОбластьЦенника.Параметры.НоменклатураСтранаПроисхождения = СтрокаТаблицы.Номенклатура.СтранаПроисхождения;
Если ТекСтолбец = 0 Тогда
ТабДокумент.Вывести(ОбластьЦенника);
Иначе
ТабДокумент.Присоединить(ОбластьЦенника);
КонецЕсли;
ТекСтолбец = ТекСтолбец + 1;
Если ТекСтолбец = 5 Тогда
ТекСтрока = ТекСтрока + 1;
ТекСтолбец = 0;
КонецЕсли;
Если ТекСтрока = 3 Тогда
ТекСтрока = 0;
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТабДокумент.ТолькоПросмотр = Истина;
Возврат ТабДокумент;
КонецФункции // ПечатьЦенника()
// Функция выполняет проверку параметров для заполнения цен.
//
// Возвращаемое значение:
// Булево - Истина, если все параметры заданы.
//
Функция ПроверитьПараметрыЗаполненияЦен(ПечетьБезПроверкиЗаполненияПараметров = Неопределено) Экспорт
Перем РезультатПроверки, СтрокаСообщения;
РезультатПроверки = Истина;
СтрокаСообщения = "";
Если НЕ ЗначениеЗаполнено(ТипЦен) Тогда
РезультатПроверки = Ложь;
СтрокаСообщения = "Не выбран тип цен! Укажите тип цен и повторите перезаполнение цен." + Символы.ПС;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Валюта) Тогда
РезультатПроверки = Ложь;
СтрокаСообщения = СтрокаСообщения + "Не выбрана валюта! Укажите валюту и повторите перезаполнение цен.";
КонецЕсли;
Если НЕ РезультатПроверки И ПечетьБезПроверкиЗаполненияПараметров <> Истина Тогда
ОбщегоНазначения.СообщитьОбОшибке(СтрокаСообщения);
КонецЕсли;
Возврат РезультатПроверки;
КонецФункции // ПроверитьПараметрыЗаполненияЦен()
#КонецЕсли |