На этой странице представлен полный исходный код клиентской части внешней обработки, которая обеспечивает интеграцию ТСД или смартфона с учетной системой BAS Управление торговлей 3.2 для выполнения пересчета товаров через смартфон и отправки данных назад в учетную систему.
На смартфоне должно быть установлено приложение Комбо Покет
Данный код:
- реализован в модуле формы внешней обработки
- построен на базе типового документа «Пересчет товаров»
- использует Combo Pocket API для отправки и получения данных
- не требует снятия конфигурации с поддержки
- может быть использован как готовое решение или как основа для собственной доработки
Это реальный рабочий код, который выполняет:
- выгрузку номенклатуры и учетных данных в ТСД / смартфон
- загрузку фактических данных обратно в документ
- обработку весовых штрихкодов
- автоматический пересчет расхождений
- работу с сериями, характеристиками, упаковками
- HTTP-взаимодействие с сервером Combo Pocket
Все точки входа в логику обмена с сервисом отмечены комментариями в коде, что позволяет легко понять архитектуру интеграции.
Что входит в открытый доступ
✔ Клиентский код внешней обработки
✔ HTTP-взаимодействие с API
✔ Логика загрузки и выгрузки данных
✔ Механизм работы с токенами
✔ Обработка весовых штрихкодов
Этот код достаточен для полной интеграции вашей базы BAS УТ 3.2 с сервисом Combo Pocket.
Что не входит в открытый доступ
❌ Исходный код мобильного приложения
❌ Исходный код серверной части Combo Pocket
Мобильное приложение и сервер являются частью SaaS-инфраструктуры Combo Pocket и не требуют доступа к исходному коду для интеграции.
Для работы достаточно:
- установить мобильное приложение
- получить токен подключения на странице покупки приложения
- использовать представленный клиентский модуль или использовать специально подготовленные внешние обработки в виде epf файлов список которых доступен на этой странице
Для кого эта страница
- Для разработчиков 1С / BAS
- Для компаний, которые хотят понять архитектуру интеграции
- Для тех, кто хочет доработать решение под свои процессы
- Для тех, кто ценит прозрачность и открытый код
Ниже приведён полный исходный код клиентской обработки.
Точки интеграции с Combo Pocket отмечены комментариями:
&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ
&НаКлиенте
Перем ТекущиеДанныеИдентификатор; //используется для передачи текущей строки в обработчик ожидания
&НаКлиенте
Перем ВыполняетсяЗапись; //используется для передачи текущей строки в обработчик ожидания
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
// Пропускаем инициализацию, чтобы гарантировать получение формы при передаче параметра "АвтоТест".
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование(ЭтаФорма);
// Обработчик подсистемы "Внешние обработки"
ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма);
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПриЧтенииСозданииНаСервере();
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
КонецЕсли;
// СтандартныеПодсистемы.Печать
УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма, Элементы.ПодменюПечать);
// Конец СтандартныеПодсистемы.Печать
// ИнтеграцияС1СДокументооборотом
ИнтеграцияС1СДокументооборот.ПриСозданииНаСервере(ЭтаФорма);
// Конец ИнтеграцияС1СДокументооборотом
ПредыдущаяДата = Объект.Дата;
СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
// ВводНаОсновании
//ВводНаОсновании.ПриСозданииНаСервере(ЭтотОбъект, Элементы.ПодменюСоздатьНаОсновании);
// Конец ВводНаОсновании
// МенюОтчеты
МенюОтчеты.ПриСозданииНаСервере(ЭтотОбъект, Элементы.ПодменюОтчеты);
// Конец МенюОтчеты
//Инициализация параметров ТСД ComboPocket +++
Настройки = ХранилищеОбщихНастроек.Загрузить("ComboPocket");
Если ЗначениеЗаполнено(Настройки) тогда
ТСД_Наименование = Настройки.activeTSD.ТСД_Наименование;
ТСД_Токен = Настройки.activeTSD.ТСД_Токен;
Для каждого Стр Из Настройки.tokens Цикл
нстр = СписокТСД.Добавить();
ЗаполнитьЗначенияСвойств(нстр, Стр);
нстр.Настройки = "Настройки";
КонецЦикла;
НастройкиСерверные = ОбновитьТаблицуСервер(Настройки);
Если НЕ НастройкиСерверные.Ошибка Тогда
Для каждого СтрокаСервер Из НастройкиСерверные.Структура.tokens Цикл
СтрокаКлиент = СписокТСД.НайтиСтроки(Новый Структура("token", СтрокаСервер.token));
Если ЗначениеЗаполнено(СтрокаКлиент) тогда
ЗаполнитьЗначенияСвойств(СтрокаКлиент[0], СтрокаСервер);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.НастройкиТСД;
КонецЕсли
//Инициализация параметров ТСД ComboPocket ---
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
ПриЧтенииСозданииНаСервере();
МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение
И Не Объект.УчетныеДанныеЗаполнены
И Объект.Товары.Количество() > 0
И Не Отказ
И НЕ ВыполняетсяЗапись Тогда
ТекстВопроса = НСтр("ru='При проведении будет перезаполнено учетное количество во всех строках табличной части. Продолжить?';uk='При проведенні буде перезаповнена облікова кількість у кожному рядку табличної частини. Продовжити?'");
ПоказатьВопрос(Новый ОписаниеОповещения("ПередЗаписьюЗавершение", ЭтотОбъект),
ТекстВопроса,
РежимДиалогаВопрос.ОКОтмена,
,
КодВозвратаДиалога.ОК);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписьюЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.ОК Тогда
Возврат;
КонецЕсли;
ВыполняетсяЗапись = Истина;
Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
ВыполняетсяЗапись = Ложь;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект.ОтборПересчета = Новый ХранилищеЗначения(ОтборПересчета.Настройки, Новый СжатиеДанных(9));
МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ЗаполнитьПризнакРасхождение();
УстановитьСостояниеРедактированияПоСтатусу();
МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
МенеджерОборудованияКлиентПереопределяемый.НачатьПодключениеОборудованиеПриОткрытииФормы(ЭтаФорма, "СканерШтрихкода");
//Инициализация параметров ТСД ComboPocket +++
Если СписокТСД.Количество() = 0 тогда
ПредупреждениеАсинх("Перш ніж почати роботу з ТСД або смартфоном, що виконує його роль - слід виконати налаштування на вкладці ""Параметри ТСД"". Просто дотримуйтесь інструкцій'");
Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.НастройкиТСД;
КонецЕсли;
//Инициализация параметров ТСД ComboPocket --
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии()
МенеджерОборудованияКлиентПереопределяемый.НачатьОтключениеОборудованиеПриЗакрытииФормы(ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// ПодключаемоеОборудование
Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
Если ИмяСобытия = "ScanData" И МенеджерОборудованияКлиентПереопределяемый.ЕстьНеобработанноеСобытие() Тогда
ОбработатьШтрихкоды(МенеджерОборудованияКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр));
КонецЕсли;
КонецЕсли;
// Конец ПодключаемоеОборудование
// Неизвестные штрихкоды
Если Источник = "ПодключаемоеОборудование"
И ИмяСобытия = "НеизвестныеШтрихкоды"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
КэшированныеЗначения.Штрихкоды.Очистить();
ДанныеШтрихкодов = Новый Массив;
Для Каждого ПолученныйШтрихкод Из Параметр.ПолученыНовыеШтрихкоды Цикл
ДанныеШтрихкодов.Добавить(ПолученныйШтрихкод);
КонецЦикла;
Для Каждого ПолученныйШтрихкод Из Параметр.ЗарегистрированныеШтрихкоды Цикл
ДанныеШтрихкодов.Добавить(ПолученныйШтрихкод);
КонецЦикла;
ОбработатьШтрихкоды(ДанныеШтрихкодов);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(РезультатВыбора, ИсточникВыбора)
Если НоменклатураКлиент.ЭтоУказаниеСерий(ИсточникВыбора) Тогда
НоменклатураКлиент.ОбработатьУказаниеСерии(ЭтаФорма, ПараметрыУказанияСерий, РезультатВыбора);
Если Не Элементы.Товары.ТекущиеДанные.ИзлишекПорча Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
ИначеЕсли ИсточникВыбора.ИмяФормы = "Справочник.Назначения.Форма.ФормаВыбора" Тогда
Элементы.Товары.ТекущиеДанные.Назначение = РезультатВыбора;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_ПересчетТоваров", ПараметрыЗаписи, Объект.Ссылка);
МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура СкладПриИзменении(Элемент)
СкладПомещениеПриИзмененииСервер();
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ПомещениеПриИзменении(Элемент)
СкладПомещениеПриИзмененииСервер();
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
Объект.УчетныеДанныеЗаполнены = Ложь;
ДатаПриИзмененииСервер();
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
Если ИспользоватьАдресноеХранение
И Объект.Проведен Тогда
Если Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыПересчетовТоваров.ВнесениеРезультатов") Тогда
Если Объект.БлокироватьЯчейки Тогда
ТекстСообщения = НСтр("ru='Снять блокировку ячеек?';uk='Зняти блокування комірок?'");
Ответ = Неопределено;
ПоказатьВопрос(Новый ОписаниеОповещения("СтатусПриИзмененииЗавершение", ЭтотОбъект), ТекстСообщения, РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Да);
Возврат;
КонецЕсли;
ИначеЕсли Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыПересчетовТоваров.ВРаботе") Тогда
Объект.Дата = ТекущаяДата();
Объект.БлокироватьЯчейки = Истина;
ИначеЕсли Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыПересчетовТоваров.Выполнено")
ИЛИ Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыПересчетовТоваров.Подготовлено") Тогда
Объект.БлокироватьЯчейки = Ложь;
КонецЕсли;
КонецЕсли;
СтатусПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзмененииЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Ответ = РезультатВопроса;
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.БлокироватьЯчейки = Ложь;
Записать(Новый Структура("РежимЗаписи",РежимЗаписиДокумента.Проведение));
Возврат;
КонецЕсли;
СтатусПриИзмененииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ИспользоватьЯчейкуИзлишкиПриИзменении(Элемент)
Элементы.ЯчейкаКонсолидацииИзлишковТоваров.Доступность = Объект.ИспользоватьОтдельнуюЯчейкуИзлишков;
Если Не(Объект.ИспользоватьОтдельнуюЯчейкуИзлишков) Тогда
Объект.ЯчейкаКонсолидацииИзлишковТоваров = Неопределено;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИспользоватьЯчейкуПорчиПриИзменении(Элемент)
Элементы.ЯчейкаКонсолидацииИспорченныхТоваров.Доступность = Объект.ИспользоватьОтдельнуюЯчейкуПорчи;
Если Не(Объект.ИспользоватьОтдельнуюЯчейкуПорчи) Тогда
Объект.ЯчейкаКонсолидацииИспорченныхТоваров = Неопределено;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтветственныйПриИзменении(Элемент)
ОтвественныйПриИзмененииСервер();
КонецПроцедуры
&НаКлиенте
Процедура ТолькоРасхожденияПриИзменении(Элемент)
Если ТолькоРасхождения Тогда
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Расхождение",Истина);
Иначе
Элементы.Товары.ОтборСтрок = Неопределено;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары
&НаКлиенте
Процедура ТоварыЯчейкаПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если Не ТекущиеДанные.ИзлишекПорча Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если НоваяСтрока Тогда
Элементы.Товары.ТекущиеДанные.Количество = 0;
Элементы.Товары.ТекущиеДанные.КоличествоФакт = 0;
Элементы.Товары.ТекущиеДанные.КоличествоУпаковок = 0;
Элементы.Товары.ТекущиеДанные.КоличествоУпаковокФакт = 0;
Элементы.Товары.ТекущиеДанные.КоличествоУпаковокОтклонение = 0;
Если Не Копирование
И Объект.Проведен Тогда
Элементы.Товары.ТекущиеДанные.Ячейка = Объект.ЯчейкаКонсолидацииИзлишковТоваров;
КонецЕсли;
Если СостояниеРедактирования = "ОграниченноеРедактирование" Тогда
Элементы.Товары.ТекущиеДанные.ИзлишекПорча = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс", "Факт");
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
СтруктураДействий.Вставить("ПроверитьЗаполнитьНазначение");
СтруктураДействий.Вставить("ЗаполнитьПризнакТипИзмеряемойВеличины", Новый Структура("Номенклатура", "ТипИзмеряемойВеличины"));
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтаФорма.ИмяФормы, "Товары"));
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.Номенклатура) Тогда
ТекущаяСтрока.КоличествоФакт = 0;
ТекущаяСтрока.КоличествоУпаковокФакт = 0;
ТекущаяСтрока.Количество = 0;
ТекущаяСтрока.КоличествоУпаковок = 0;
ТекущаяСтрока.КоличествоУпаковокОтклонение = 0;
КонецЕсли;
Если Не ТекущаяСтрока.ИзлишекПорча Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыХарактеристикаПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если Не ТекущиеДанные.ИзлишекПорча Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНазначениеПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если Не ТекущиеДанные.ИзлишекПорча Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Элементы.Товары.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс", "Факт");
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
Если Не ТекущаяСтрока.ИзлишекПорча Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокФактПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействий);
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПередУдалением(Элемент, Отказ)
ОчиститьСообщения();
Если СостояниеРедактирования = "НеРедактируется" Тогда
Отказ = Истина;
ИначеЕсли СостояниеРедактирования = "ОграниченноеРедактирование" Тогда
Отказ = Истина;
ВыделененныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для Каждого Идентификатор из ВыделененныеСтроки Цикл
СтрТабл = Элементы.Товары.ДанныеСтроки(Идентификатор);
Если СтрТабл.ИзлишекПорча Тогда
Объект.Товары.Удалить(СтрТабл);
Иначе
ТекстСообщения = НСтр("ru='Строку %НомерСтроки% удалить нельзя, т.к. она была добавлена до начала пересчета.';uk='Рядок %НомерСтроки% видалити неможна, тому що він був доданий до початку перерахунку.'");
ТекстСообщения = СтрЗаменить(ТекстСообщения,"%НомерСтроки%", СтрТабл.НомерСтроки);
Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Товары", СтрТабл.НомерСтроки, "НомерСтроки");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,Поле,"Объект",Отказ);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСерияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОткрытьПодборСерий(Элемент.ТекстРедактирования);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСерияПриИзменении(Элемент)
ВыбранноеЗначение = НоменклатураКлиентСервер.ВыбраннаяСерия();
ВыбранноеЗначение.Значение = Элементы.Товары.ТекущиеДанные.Серия;
ВыбранноеЗначение.ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
НоменклатураКлиент.ОбработатьУказаниеСерии(ЭтаФорма, ПараметрыУказанияСерий, ВыбранноеЗначение);
Если Не Элементы.Товары.ТекущиеДанные.ИзлишекПорча Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
Если Не ОтменаРедактирования
И НоваяСтрока Тогда
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если Не ТекущаяСтрока.ИзлишекПорча Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
// ВводНаОсновании
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуСоздатьНаОсновании(Команда)
ВводНаОснованииКлиент.ВыполнитьПодключаемуюКомандуСоздатьНаОсновании(Команда, ЭтотОбъект, Объект);
КонецПроцедуры
// Конец ВводНаОсновании
// МенюОтчеты
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуОтчет(Команда)
МенюОтчетыКлиент.ВыполнитьПодключаемуюКомандуОтчет(Команда, ЭтотОбъект, Объект);
КонецПроцедуры
// Конец МенюОтчеты
// СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки
&НаКлиенте
Процедура Подключаемый_ВыполнитьНазначаемуюКоманду(Команда)
Если НЕ ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуНаКлиенте(ЭтаФорма, Команда.Имя) Тогда
РезультатВыполнения = Неопределено;
ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаСервере(Команда.Имя, РезультатВыполнения);
ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ЭтаФорма, РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
// Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки
&НаКлиенте
Процедура Заполнить(Команда)
Если Не СкладПомещениеЗаполнены() Тогда
Возврат;
КонецЕсли;
Если Объект.Товары.Количество() > 0 Тогда
Ответ = Неопределено;
ПоказатьВопрос(Новый ОписаниеОповещения("ЗаполнитьЗавершение", ЭтотОбъект), НСтр("ru='Перед заполнением список товаров будет очищен. Продолжить?';uk='Перед заповненням список товарів буде очищений. Продовжити?'"), РежимДиалогаВопрос.ДаНет);
Возврат;
КонецЕсли;
ЗаполнитьФрагмент();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Ответ = РезультатВопроса;
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.Товары.Очистить();
Иначе
Возврат;
КонецЕсли;
ЗаполнитьФрагмент();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьФрагмент()
ЗаполнитьСервер();
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьФактПоУчету(Команда)
Если КоличествоФактЗаполнено() Тогда
ТекстВопроса = НСтр("ru='В табличной части уже есть строки с заполненным фактическим количеством.
|При заполнении эта информация будет утеряна. Продолжить?'
|;uk='У табличній частині вже є рядки із заповненою фактичною кількістю.
|При заповненні ця інформація буде втрачена. Продовжити?'");
Ответ = Неопределено;
ПоказатьВопрос(Новый ОписаниеОповещения("ЗаполнитьФактПоУчетуЗавершение", ЭтотОбъект), ТекстВопроса,РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Да);
Возврат;
КонецЕсли;
ЗаполнитьФактПоУчетуСервер();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьФактПоУчетуЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Ответ = РезультатВопроса;
Если Ответ <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
ЗаполнитьФактПоУчетуСервер();
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьКачество(Команда)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ОчиститьСообщения();
Если ТекущиеДанные = Неопределено Тогда
ТекстСообщения = НСтр("ru='Выберите строку табличной части';uk='Виберіть рядок табличної частини'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
Возврат
КонецЕсли;
Если Не(ТекущиеДанные.ИзлишекПорча) И ИспользоватьСтатусыПересчетовТоваров Тогда
ТекстСообщения = НСтр("ru='Невозможно изменить качество в строке, добавленной до начала пересчета. Воспользуйтесь командой ""Разбить строку"".';uk='Неможливо змінити якість в рядку, доданому до початку перерахунку. Скористайтеся командою ""Розбити рядок"".'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,"Объект.Товары["+Формат(ТекущиеДанные.НомерСтроки-1,"ЧГ=0")+"].НомерСтроки",,);
Возврат;
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущиеДанные.Характеристика);
СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущиеДанные.Упаковка);
Если ЗначениеЗаполнено(ТекущиеДанные.Характеристика) Тогда
СтруктураДействий.Вставить("ЗаполнитьХарактеристикуНекачественногоТовара", ТекущиеДанные.Характеристика);
КонецЕсли;
Если ЗначениеЗаполнено(ТекущиеДанные.Упаковка) Тогда
СтруктураДействий.Вставить("ЗаполнитьУпаковкуНекачественногоТовара", ТекущиеДанные.Упаковка);
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ИзменитьКачествоЗавершение", ЭтотОбъект, Новый Структура("ТекущиеДанные", ТекущиеДанные));
СкладыКлиент.ИзменитьКачество(ТекущиеДанные, СтруктураДействий, КэшированныеЗначения, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьКачествоЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Объект.ИспользоватьОтдельнуюЯчейкуПорчи Тогда
ДополнительныеПараметры.ТекущиеДанные.Ячейка = Объект.ЯчейкаКонсолидацииИспорченныхТоваров;
КонецЕсли;
Если ЗначениеЗаполнено(ДополнительныеПараметры.ТекущиеДанные.Назначение) Тогда
ТекстВопроса = НСтр("ru='Очистить колонку ""Назначение"" для товара с измененным качеством?';uk='Очистити колонку ""Призначення"" для товару із зміненою якістю?'");
ОписаниеОповещения = Новый ОписаниеОповещения("ИзменитьКачествоОчиститьНазначениеЗавершение", ЭтаФорма, Новый Структура("ТекущиеДанные", ДополнительныеПараметры.ТекущиеДанные));
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьКачествоОчиститьНазначениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
ОчиститьНазначение = (Результат = КодВозвратаДиалога.Да);
ТекущиеДанные = ДополнительныеПараметры.ТекущиеДанные;
Если ОчиститьНазначение Тогда
ТекущиеДанные.Назначение = ПредопределенноеЗначение("Справочник.Назначения.ПустаяСсылка");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтроку(Команда)
ТаблицаФормы = Элементы.Товары;
ДанныеТаблицы = Объект.Товары;
ПараметрыРазбиенияСтроки = ОбщегоНазначенияУТКлиент.ПараметрыРазбиенияСтроки();
ПараметрыРазбиенияСтроки.ИмяПоляКоличество = "КоличествоУпаковокФакт";
ПараметрыРазбиенияСтроки.Заголовок = НСтр("ru='Введите фактическое количество товара в новой строке';uk='Введіть фактичну кількість товару у новому рядку'");
Оповещение = Новый ОписаниеОповещения("РазбитьСтрокуЗавершение", ЭтотОбъект);
ОбщегоНазначенияУТКлиент.РазбитьСтрокуТЧ(ДанныеТаблицы, ТаблицаФормы, Оповещение, ПараметрыРазбиенияСтроки);
КонецПроцедуры
&НаКлиенте
Процедура РазбитьСтрокуЗавершение(НоваяСтрока, ДополнительныеПараметры) Экспорт
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если НоваяСтрока <> Неопределено Тогда
Если ЗначениеЗаполнено(Объект.ЯчейкаКонсолидацииИзлишковТоваров) Тогда
НоваяСтрока.Ячейка = Объект.ЯчейкаКонсолидацииИзлишковТоваров
КонецЕсли;
НоваяСтрока.ИзлишекПорча = Истина;
НоваяСтрока.Количество = 0;
НоваяСтрока.КоличествоУпаковок = 0;
НоваяСтрока.КоличествоУпаковокОтклонение = 0;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействий);
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоискПоШтрихкодуВыполнить(Команда)
ОчиститьСообщения();
Оповещение = Новый ОписаниеОповещения("ПоискПоШтрихкодуЗавершение", ЭтотОбъект);
ШтрихкодированиеНоменклатурыКлиент.ПоказатьВводШтрихкода(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПоискПоШтрихкодуЗавершение(ДанныхШтрихкода, ДополнительныеПараметры) Экспорт
ОбработатьШтрихкоды(ДанныхШтрихкода);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьВес(Команда)
ТекущаяСтрока = МенеджерОборудованияУТКлиент.ТекущаяСтрока(ЭтаФорма);
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
МенеджерОборудованияКлиент.НачатьПолученияВесаСЭлектронныхВесов(
Новый ОписаниеОповещения("ПолучитьВесЗавершение", ЭтотОбъект, ТекущаяСтрока),
УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьВесЗавершение(РезультатВыполнения, ТекущаяСтрока) Экспорт
Если РезультатВыполнения.Результат Тогда
Если ИспользоватьАдресноеХранение Тогда
ТекущаяСтрока.КоличествоУпаковокФакт = РезультатВыполнения.Вес;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс", "Факт");
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ТекущаяСтрока.Расхождение = ТекущаяСтрока.КоличествоУпаковок <> ТекущаяСтрока.КоличествоУпаковокФакт;
ТекущаяСтрока.КоличествоУпаковок = ТекущаяСтрока.КоличествоУпаковок - ТекущаяСтрока.КоличествоУпаковокФакт;
Иначе
ТекущаяСтрока.КоличествоФакт = РезультатВыполнения.Вес;
ТекущаяСтрока.КоличествоУпаковокФакт = ТекущаяСтрока.КоличествоФакт;
ТекущаяСтрока.Расхождение = ТекущаяСтрока.Количество <> ТекущаяСтрока.КоличествоФакт;
ТекущаяСтрока.КоличествоУпаковок = ТекущаяСтрока.Количество - ТекущаяСтрока.КоличествоФакт;
КонецЕсли;
Иначе
МенеджерОборудованияКлиентПереопределяемый.СообщитьОбОшибке(РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
//Точка входа в получение данных из ТСД ComboPocket +++
&НаКлиенте
Процедура ЗагрузитьДанныеИзТСД(Команда)
Ответ = ЗагрузитьДанныеИзТСДСервер();
Если Ответ.Ошибка тогда
ПредупреждениеАсинх(Ответ.ОписаниеОшибки);
Возврат;
КонецЕсли;
ПересчитатьФактПослеЗагрузкиТСД();
КонецПроцедуры
//Точка входа в получение данных из ТСД ComboPocket ---
&НаКлиенте
Процедура ПересчитатьФактПослеЗагрузкиТСД()
// тот же набор действий, что при ручном изменении КоличествоУпаковокФакт
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействий);
Для каждого СтрТабл Из Объект.Товары Цикл
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрТабл, СтруктураДействий, КэшированныеЗначения);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПомножитьСимвол(Символ, Колво)
Строка = "";
н=1;
Пока н<=колво Цикл
Строка = Строка+Символ;
н=н+1;
КонецЦикла;
Возврат Строка;
КонецФункции
&НаСервере
Функция ЗагрузитьДанныеИзТСДСервер()
Настройки = СписокТСД.НайтиСтроки(Новый Структура("token", ТСД_Токен))[0];
Если Настройки.РаботатьСВесовымиШтрихкодами тогда
weightSettings = ДесериализоватьJSON(Настройки.weightSettings);
КонецЕсли;
Запрос = Новый Структура;
Запрос.Вставить("token",ТСД_Токен);
Ответ = ВыполнитьHTTPЗапрос("download", Запрос);
Если Ответ.Ошибка тогда
Возврат Ответ;
КонецЕсли;
ТоварыМассив = Ответ.Структура.goods;
КС = Новый КвалификаторыСтроки(120);
Штрихкод = Новый ОписаниеТипов("Строка",,,,КС);
КЧ = Новый КвалификаторыЧисла(12,3);
Число = Новый ОписаниеТипов("Число",,,КЧ);
ТоварыТЗ = Новый ТаблицаЗначений;
ТоварыТЗ.Колонки.Добавить("Штрихкод", Штрихкод);
//ТоварыТЗ.Колонки.Добавить("КодВесовой", Штрихкод);
ТоварыТЗ.Колонки.Добавить("Факт", Число);
ТоварыТЗ.Колонки.Добавить("Учет", Число);
Для каждого Стр Из ТоварыМассив Цикл
нстр = ТоварыТЗ.Добавить();
Если Стр.isweight тогда
ПолныйСКЮ = Формат(Стр.sku, "ЧЦ="+weightSettings[0].skuLength+"; ЧРГ=; ЧВН=");
ПолныйСКЮ = СтрЗаменить(ПолныйСКЮ, Символы.НПП, "");
КодВесовой = "2_"+ПолныйСКЮ;
КолвоСимволовВес = 12-СтрДлина(КодВесовой);
КодВесовой = КодВесовой + ПомножитьСимвол("0",КолвоСимволовВес);
КодВесовой = КодВесовой+"_";
нстр.Штрихкод = КодВесовой;
Иначе
нстр.Штрихкод = стр.bc;
КонецЕсли;
нстр.Факт = стр.qty;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТоварыТЗ.Штрихкод,
| ТоварыТЗ.Факт
|ПОМЕСТИТЬ ТоварыИзТСД
|ИЗ
| &ТоварыТЗ КАК ТоварыТЗ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЕСТЬNULL(ШтрихкодыНоменклатуры.Номенклатура, ТоварыИзТСД.Штрихкод) КАК Номенклатура,
| ШтрихкодыНоменклатуры.Характеристика,
| ШтрихкодыНоменклатуры.Штрихкод,
| ТоварыИзТСД.Факт
|ПОМЕСТИТЬ Маппинг
|ИЗ
| ТоварыИзТСД КАК ТоварыИзТСД
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
| ПО (ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО ТоварыИзТСД.Штрихкод)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Маппинг.Номенклатура,
| Маппинг.Номенклатура.Наименование КАК Наименование,
| СУММА(Маппинг.Факт) КАК Факт,
| Маппинг.Характеристика
|ИЗ
| Маппинг КАК Маппинг
|
|СГРУППИРОВАТЬ ПО
| Маппинг.Номенклатура,
| Маппинг.Номенклатура.Наименование,
| Маппинг.Характеристика";
Запрос.УстановитьПараметр("ТоварыТЗ",ТоварыТЗ);
Результат = Запрос.Выполнить().Выгрузить();
НовыеПозицииТаблицы = Новый Массив;
НеНайденыеШтрихкоды = Новый Массив;
Для каждого Стр Из Результат Цикл
Если ТипЗНЧ(Стр.Номенклатура) = Тип("Строка") тогда
НеНайденыеШтрихкоды.Добавить("В вашей базе не существует штрихкод: "+Стр.Номенклатура+" однако по нему насчитано товара: "+Стр.Факт);
КонецЕсли;
НайденыТовары = Объект.Товары.НайтиСтроки(Новый Структура("Номенклатура, Характеристика", Стр.Номенклатура, Стр.Характеристика));
Если НайденыТовары.Количество() = 0 тогда
//Товар не найден в таблице Пересчета
Если Настройки.СобиратьНеизвестныеШтрихкоды тогда
НовыеПозицииТаблицы.Добавить("Товар был даобавлен в таблицу. Изначально он небыл добавлен в таблицу. "+Стр.Наименование+" количество: "+Стр.Факт);
нстр = Объект.Товары.Добавить();
нстр.Номенклатура = Стр.Номенклатура;
нстр.КоличествоУпаковокФакт = Стр.Факт;
КонецЕсли;
Иначе
НайденыТовары[0].КоличествоУпаковокФакт = Стр.Факт;
КонецЕсли;
КонецЦикла;
Возврат Ответ;
КонецФункции
//Точка входа в отправку данных в ТСД ComboPocket +++
&НаКлиенте
Процедура ВыгрузитьДанныеВТСД(Команда)
Если НЕ ЗначениеЗаполнено(ТСД_Токен) тогда
ПредупреждениеАсинх("Необходимо выбрать ТСД на странице ""Настройки ТСД""");
Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.НастройкиТСД;
Возврат;
КонецЕсли;
Настройки = СписокТСД.НайтиСтроки(Новый Структура("token", ТСД_Токен));
Настройки = Настройки[0];
НастройкиСтруктура = Новый Структура;
НастройкиСтруктура.Вставить("token", ТСД_Токен);
НастройкиСтруктура.Вставить("ОтображатьУчетноеКолво", Настройки.ОтображатьУчетноеКолво);
НастройкиСтруктура.Вставить("ОтображатьЦену", Настройки.ОтображатьЦену);
НастройкиСтруктура.Вставить("СобиратьНеизвестныеШтрихкоды", Настройки.СобиратьНеизвестныеШтрихкоды);
НастройкиСтруктура.Вставить("РаботатьСВесовымиШтрихкодами", Настройки.РаботатьСВесовымиШтрихкодами);
НастройкиСтруктура.Вставить("weightSettings", Настройки.weightSettings);
ТоварыМассив = Новый Массив;
Для каждого Стр Из Объект.Товары Цикл
Структура = Новый Структура;
Структура.Вставить("Номенклатура", Стр.Номенклатура);
Структура.Вставить("Характеристика", Стр.Характеристика);
Структура.Вставить("Учет", Стр.КоличествоУпаковок);
Структура.Вставить("Факт", Стр.КоличествоУпаковокФакт);
ТоварыМассив.Добавить(Структура);
КонецЦикла;
Ответ = ВыгрузитьДанныеВТСДСервер(ТоварыМассив, НастройкиСтруктура);
Если Ответ.Ошибка тогда
ПредупреждениеАсинх(Ответ.ОписаниеОшибки);
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Ответ.ЛокальныеОшибкиШтрихкодов) тогда
Для каждого Стр Из Ответ.ЛокальныеОшибкиШтрихкодов Цикл
Сообщить(Стр);
КонецЦикла;
ПредупреждениеАсинх("Есть товары без штрихкодов. Товары без штрихкода не отправлены в ТСД");
КонецЕсли;
ПредупреждениеАсинх("Данные успешно отправлены в ТСД: "+Символы.ПС+ТСД_Наименование);
КонецПроцедуры
//Точка входа в отправку данных в ТСД ComboPocket ---
&НаСервереБезКонтекста
Функция ВыгрузитьДанныеВТСДСервер(ТоварыМассив, Настройки)
Если Настройки.РаботатьСВесовымиШтрихкодами тогда
weightSettings = ДесериализоватьJSON(Настройки.weightSettings);
КонецЕсли;
ПрефиксыВесовыхШтрихкодов = ЗначениеНастроекПовтИсп.ПолучитьПрефиксыВесовыхШтрихкодов();
Номенклатура = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
Характеристика = Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры");
КЧ = Новый КвалификаторыЧисла(12,3);
Число = Новый ОписаниеТипов("Число",,,КЧ);
Товары = Новый ТаблицаЗначений;
Товары.Колонки.Добавить("Номенклатура", Номенклатура);
Товары.Колонки.Добавить("Характеристика", Характеристика);
Товары.Колонки.Добавить("Факт", Число);
Товары.Колонки.Добавить("Учет", Число);
Для каждого Стр Из ТоварыМассив Цикл
ЗаполнитьЗначенияСвойств(Товары.Добавить(), Стр);
КонецЦикла;
Запрос = Новый Запрос;
//Снят контроль уникальности
Запрос.Текст = "ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Факт,
| Товары.Учет,
| Товары.Характеристика
|ПОМЕСТИТЬ ВводТовары
|ИЗ
| &Товары КАК Товары
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВводТовары.Номенклатура,
| СУММА(ВводТовары.Факт) КАК Факт,
| СУММА(ВводТовары.Учет) КАК Учет,
| ВводТовары.Характеристика
|ПОМЕСТИТЬ Товары
|ИЗ
| ВводТовары КАК ВводТовары
|
|СГРУППИРОВАТЬ ПО
| ВводТовары.Номенклатура,
| ВводТовары.Характеристика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Номенклатура.Наименование как Наименование,
| Товары.Номенклатура.ВесИспользовать как ЭтоВесовой,
| Товары.Факт,
| Товары.Учет,
| Товары.Характеристика,
| Товары.Характеристика.Наименование как ХарактеристикаНаименование
|ИЗ
| Товары КАК Товары
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура,
| ШтрихкодыНоменклатуры.Штрихкод,
| ШтрихкодыНоменклатуры.Характеристика,
| ШтрихкодыНоменклатуры.Упаковка.Вес
|ИЗ
| Товары КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
| ПО Товары.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
| И Товары.Характеристика = ШтрихкодыНоменклатуры.Характеристика";
Запрос.УстановитьПараметр("Товары", Товары);
Пакет = Запрос.ВыполнитьПакет();
Товары = Пакет[2].Выгрузить();
Штрихкоды = Пакет[3].Выгрузить();
ЛокальныеОшибкиШтрихкодов = Новый Массив;
goods = Новый Массив;
Для каждого Товар Из Товары Цикл
СтрокиШтриходы = Штрихкоды.НайтиСтроки(Новый Структура("Номенклатура, Характеристика", Товар.Номенклатура, Товар.Характеристика));
Если СтрокиШтриходы.Количество() = 0 тогда
ЛокальныеОшибкиШтрихкодов.Добавить("Товар без штрихкода: "+Товар.Наименование+" - не отправлен в ТСД, так как товар должен иметь штрихкод");
Продолжить;
КонецЕсли;
Структура = Новый Структура;
Структура.Вставить("nom");
Структура.Вставить("bc");
Структура.Вставить("qty");
Структура.Вставить("mqty");
//Структура.Вставить("char");
Первый = Истина;
Для каждого СтрокаШтрихкод Из СтрокиШтриходы Цикл
Штрихкод = СтрокаШтрихкод.Штрихкод;
Если ЗначениеЗаполнено(Товар.Характеристика) тогда
Структура.Вставить("char", Товар.ХарактеристикаНаименование);
КонецЕсли;
Если Товар.ЭтоВесовой тогда
ДлинаПрефикса = СтрДлина(weightSettings[0].prefix);
ПрефиксВход = Лев(СтрокаШтрихкод.Штрихкод,ДлинаПрефикса);
Если СтрНайти(ПрефиксВход, "_") > 0 тогда
//Меняем префикс
ШкБезПрефикса = Сред(СтрокаШтрихкод.Штрихкод, ДлинаПрефикса+1);
Штрихкод = ""+weightSettings[0].prefix+ШкБезПрефикса;
Если СтрЗаканчиваетсяНа(Штрихкод,"_") тогда
Штрихкод = Лев(Штрихкод, СтрДлина(Штрихкод)-1);
Штрихкод = Штрихкод+"0";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Структура.nom = Товар.Наименование;
Структура.bc = Штрихкод;
Если Первый тогда
Структура.qty = Товар.Факт;
Если Настройки.ОтображатьУчетноеКолво тогда
Структура.mqty = Товар.Учет;
КонецЕсли;
Первый = Ложь;
Иначе
Структура.qty = 0;
Если Настройки.ОтображатьУчетноеКолво тогда
Структура.mqty = 0;
КонецЕсли;
КонецЕсли;
goods.Добавить(Структура);
КонецЦикла;
КонецЦикла;
Запрос = Новый Структура;
Запрос.Вставить("token", Настройки.token);
Запрос.Вставить("useDataCollectorMode", Настройки.СобиратьНеизвестныеШтрихкоды);
Если Настройки.РаботатьСВесовымиШтрихкодами тогда
Запрос.Вставить("weightSettings", weightSettings);
КонецЕсли;
Запрос.Вставить("goods",goods);
Ответ = ВыполнитьHTTPЗапрос("upload",Запрос);
Ответ.Вставить("ЛокальныеОшибкиШтрихкодов", ЛокальныеОшибкиШтрихкодов);
Возврат Ответ;
КонецФункции
// ИнтеграцияС1СДокументооборотом
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
ИнтеграцияС1СДокументооборотКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтаФорма, Объект);
КонецПроцедуры
//Конец ИнтеграцияС1СДокументооборотом
&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
КонецПроцедуры
//Конец ИнтеграцияС1СДокументооборотом
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьАдресноеХранение");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Упаковка");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыНоменклатуры.Товар;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипИзмеряемойВеличины");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыИзмеряемыхВеличин.КоличествоШтук;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.НезаполненноеПолеТаблицы);
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНазначение.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыЯчейка.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатураЕдиницаИзмерения.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковок.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНомерСтроки.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСерия.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатураЕдиницаИзмерения.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СостояниеРедактирования");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = НСтр("ru='ОграниченноеРедактирование';uk='ОграниченноеРедактирование'");
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ИзлишекПорча");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.FormBackColor);
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
//
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма);
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ХарактеристикиИспользуются");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Характеристика");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Истина);
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокОтклонение.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокФакт.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Статус");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(Перечисления.СтатусыПересчетовТоваров.ВРаботе);
СписокЗначений.Добавить(Перечисления.СтатусыПересчетовТоваров.Подготовлено);
ОтборЭлемента.ПравоеЗначение = СписокЗначений;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru='<для внесения результата>';uk='<для внесення результату>'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНазначение.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыЯчейка.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковок.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокФакт.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокОтклонение.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНомерСтроки.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСерия.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатураЕдиницаИзмерения.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СостояниеРедактирования");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = НСтр("ru='НеРедактируется';uk='НеРедактируется'");
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.FormBackColor);
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
//
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма);
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);
ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьАдресноеХранение");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипНоменклатуры");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыНоменклатуры.Товар;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТипИзмеряемойВеличины");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыИзмеряемыхВеличин.КоличествоШтук;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Упаковка");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
//
НоменклатураСервер.УстановитьУсловноеОформлениеСерийНоменклатуры(ЭтаФорма, "СерииВсегдаВТЧТовары");
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковокФакт.Имя);
ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
ГруппаОтбора2 = ГруппаОтбора1.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора2.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ОтборЭлемента = ГруппаОтбора2.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыНоменклатуры.МногооборотнаяТара;
ОтборЭлемента = ГруппаОтбора2.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ХарактеристикиИспользуются");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
ОтборЭлемента = ГруппаОтбора2.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Характеристика");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьАдресноеХранение");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru='<пустая ячейка>';uk='<порожня комірка>'"));
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатура.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьАдресноеХранение");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
//
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковок.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СостояниеРедактирования");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = НСтр("ru='РедактированиеБезСтатусов';uk='РедактированиеБезСтатусов'");
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
//
НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма);
//
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоНоменклатуре()
ПараметрыЗаполненияРеквизитов = Новый Структура;
ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются",
Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакТипНоменклатуры",
Новый Структура("Номенклатура", "ТипНоменклатуры"));
ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакАртикул",
Новый Структура("Номенклатура", "Артикул"));
ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакТипИзмеряемойВеличины",
Новый Структура("Номенклатура", "ТипИзмеряемойВеличины"));
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(Объект.Товары,ПараметрыЗаполненияРеквизитов);
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииСозданииНаСервере()
НастроитьПоСкладуПомещению();
ИнициализироватьКомпоновкуДанных(Ложь);
Элементы.ЯчейкаКонсолидацииИзлишковТоваров.Доступность = Объект.ИспользоватьОтдельнуюЯчейкуИзлишков;
Элементы.ЯчейкаКонсолидацииИспорченныхТоваров.Доступность = Объект.ИспользоватьОтдельнуюЯчейкуПорчи;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ЗаполнитьПризнакРасхождение();
УстановитьСостояниеРедактированияПоСтатусу();
Элементы.ГруппаИнвентаризационныеОписи.Видимость = ПравоДоступа("Изменение", Метаданные.Документы.ПересчетТоваров);
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ПересчетТоваров));
УстановитьВидимостьЭлементовСерий();
КонецПроцедуры
// СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки
&НаСервере
Процедура ДополнительныеОтчетыИОбработкиВыполнитьНазначаемуюКомандуНаСервере(ИмяЭлемента, РезультатВыполнения)
ДополнительныеОтчетыИОбработки.ВыполнитьНазначаемуюКомандуНаСервере(ЭтаФорма, ИмяЭлемента, РезультатВыполнения);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки
#Область ПриИзмененииРеквизитов
&НаСервере
Процедура СкладПомещениеПриИзмененииСервер()
ИспользоватьАдресноеХранениеТекущее = ИспользоватьАдресноеХранение;
НастроитьПоСкладуПомещению();
Если ИспользоватьАдресноеХранение И Объект.Статус = Перечисления.СтатусыПересчетовТоваров.ВРаботе Тогда
Объект.Статус = Перечисления.СтатусыПересчетовТоваров.Подготовлено;
ИначеЕсли Не ИспользоватьАдресноеХранение И Объект.Статус = Перечисления.СтатусыПересчетовТоваров.Подготовлено Тогда
Объект.Статус = Перечисления.СтатусыПересчетовТоваров.ВРаботе;
КонецЕсли;
Если ИспользоватьАдресноеХранениеТекущее
И Не ИспользоватьАдресноеХранение Тогда
Для Каждого СтрТабл из Объект.Товары Цикл
СтрТабл.Упаковка = Неопределено;
СтрТабл.КоличествоУпаковок = СтрТабл.Количество;
СтрТабл.КоличествоУпаковокФакт = СтрТабл.КоличествоФакт;
СтрТабл.КоличествоУпаковокОтклонение = СтрТабл.КоличествоФакт - СтрТабл.КоличествоУпаковок;
КонецЦикла;
КонецЕсли;
СтруктураЯчеек = Документы.ПересчетТоваров.ПолучитьЯчейкиИзлишковИБракаПоУмолчанию(Объект.Ссылка, Объект.Склад, Объект.Помещение);
ЗаполнитьЗначенияСвойств(Объект, СтруктураЯчеек);
Элементы.ЯчейкаКонсолидацииИзлишковТоваров.Доступность = Объект.ИспользоватьОтдельнуюЯчейкуИзлишков;
Элементы.ЯчейкаКонсолидацииИспорченныхТоваров.Доступность = Объект.ИспользоватьОтдельнуюЯчейкуПорчи;
ИнициализироватьКомпоновкуДанных(Истина);
ПодготовитьЗаполнитьУстановитьВидимостьСерий();
КонецПроцедуры
&НаСервере
Процедура ДатаПриИзмененииСервер()
НастроитьПоСкладуПомещению();
ПодготовитьЗаполнитьУстановитьВидимостьСерий();
КонецПроцедуры
&НаСервере
Процедура ОтвественныйПриИзмененииСервер()
Объект.ПечататьКоличествоПоУчету = Документы.ПересчетТоваров.ПолучитьЗначениеПризнакаПечататьКоличествоПоУчетуПоУмолчанию(Объект.Ссылка, Объект.Ответственный);
КонецПроцедуры
#КонецОбласти
#Область ПодборыИОбработкаПроверкиКоличества
&НаКлиенте
Процедура ОткрытьПодборСерий(Текст = "", ТекущиеДанные = Неопределено)
СостояниеРедактирования = СостояниеРедактированияДокумента(Объект.Статус, Объект.Проведен, ИспользоватьСтатусыПересчетовТоваров);
Если Не (СостояниеРедактирования = "ПолноеРедактирование" Или СостояниеРедактирования = "ОграниченноеРедактирование") Тогда
Возврат;
КонецЕсли;
Если НоменклатураКлиент.ДляУказанияСерийНуженСерверныйВызов(ЭтаФорма, ПараметрыУказанияСерий, Текст, ТекущиеДанные) Тогда
ТекстИсключения = НСтр("ru='Ошибка при попытке указать серии - в этом документе для указания серий не нужен серверный вызов.';uk='Помилка при спробі зазначити серії - в цьому документі для зазначення серій не потрібен серверний виклик.'");
ВызватьИсключение ТекстИсключения;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ШтрихкодыИТорговоеОборудование
&НаКлиенте
Процедура ОбработатьШтрихкоды(ДанныеШтрихкодов)
ИзменятьКоличество = Не (СостояниеРедактирования = "НеРедактируется");
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействийСДобавленнымиСтроками.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакТипИзмеряемойВеличины", Новый Структура("Номенклатура", "ТипИзмеряемойВеличины"));
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействийСДобавленнымиСтроками);
Если СостояниеРедактирования = "ОграниченноеРедактирование" Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьФлагИзлишекПорча");
КонецЕсли;
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействийСИзмененнымиСтроками);
СтруктураДействий = ШтрихкодированиеНоменклатурыКлиент.ПараметрыОбработкиШтрихкодов();
СтруктураДействий.Штрихкоды = ДанныеШтрихкодов;
СтруктураДействий.СтруктураДействийСДобавленнымиСтроками = СтруктураДействийСДобавленнымиСтроками;
СтруктураДействий.СтруктураДействийСИзмененнымиСтроками = СтруктураДействийСИзмененнымиСтроками;
СтруктураДействий.ПараметрыУказанияСерий = ПараметрыУказанияСерий;
СтруктураДействий.ИмяКолонкиКоличество = "КоличествоУпаковокФакт";
СтруктураДействий.НеИспользоватьУпаковки = Не ИспользоватьАдресноеХранение;
СтруктураДействий.ИзменятьКоличество = ИзменятьКоличество;
СтруктураДействий.ТолькоТовары = Истина;
ОбработатьШтрихкодыСервер(СтруктураДействий,КэшированныеЗначения);
ШтрихкодированиеНоменклатурыКлиент.ОбработатьНеизвестныеШтрихкоды(СтруктураДействий,КэшированныеЗначения,ЭтаФорма);
Если ШтрихкодированиеНоменклатурыКлиент.НужноОткрытьФормуУказанияСерийПослеОбработкиШтрихкодов(СтруктураДействий) Тогда
ТекущиеДанныеИдентификатор = СтруктураДействий.МассивСтрокССериями[0];
ПодключитьОбработчикОжидания("ОткрытьПодборСерийПриСканированииШтрихкодаНоменклатуры",0.1,Истина);
КонецЕсли;
Если СтруктураДействий.ТекущаяСтрока <> Неопределено Тогда
Элементы.Товары.ТекущаяСтрока = СтруктураДействий.ТекущаяСтрока;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьШтрихкодыСервер(СтруктураПараметровДействия,КэшированныеЗначения)
ШтрихкодированиеНоменклатурыСервер.ОбработатьШтрихкоды(ЭтаФорма, Объект, СтруктураПараметровДействия, КэшированныеЗначения);
КонецПроцедуры
#КонецОбласти
#Область Серии
&НаСервере
Процедура УстановитьВидимостьЭлементовСерий()
Элементы.ТоварыСерия.Видимость = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
КонецПроцедуры
&НаСервере
Процедура ПодготовитьЗаполнитьУстановитьВидимостьСерий()
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ПересчетТоваров));
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
УстановитьВидимостьЭлементовСерий();
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПодборСерийПриСканированииШтрихкодаНоменклатуры()
Если ТекущиеДанныеИдентификатор = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущиеДанныеИдентификатор);
ОткрытьПодборСерий(,ТекущиеДанные);
КонецПроцедуры
#КонецОбласти
#Область Прочее
&НаСервере
Процедура СтатусПриИзмененииНаСервере()
ПрошлыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "Статус");
Если ПрошлыйСтатус = Перечисления.СтатусыПересчетовТоваров.Подготовлено
И Объект.Статус = Перечисления.СтатусыПересчетовТоваров.ВРаботе Тогда
Объект.УчетныеДанныеЗаполнены = Ложь;
КонецЕсли;
УстановитьСостояниеРедактированияПоСтатусу();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСервер()
УстановитьЗначениеПараметраНастроек(ОтборПересчета.Настройки, "ДатаОстатков", ?(ЗначениеЗаполнено(Объект.Дата), Объект.Дата, ТекущаяДата()));
Если ИспользоватьАдресноеХранение Тогда
СхемаКомпоновкиДанных = Документы.ПересчетТоваров.ПолучитьМакет("ОтборПересчетаПоЯчейкам");
Иначе
СхемаКомпоновкиДанных = Документы.ПересчетТоваров.ПолучитьМакет("ОтборПересчетаПоСкладу");
КонецЕсли;
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.ЗаполнениеПоОтборам.Запрос;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
"&ТекстЗапросаКоэффициентУпаковки",
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
"ТоварыВЯчейках.Упаковка", Неопределено));
СхемаКомпоновкиДанных.НаборыДанных.ЗаполнениеПоОтборам.Запрос = ТекстЗапроса;
СегментыСервер.ВключитьОтборПоСегментуНоменклатурыВСКД(ОтборПересчета);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ОтборПересчета.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Объект.Товары.Загрузить(ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных));
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ЗаполнитьПризнакРасхождение();
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьФактПоУчетуСервер()
Для Каждого СтрТабл из Объект.Товары Цикл
СтрТабл.КоличествоФакт = СтрТабл.Количество;
СтрТабл.КоличествоУпаковокФакт = СтрТабл.КоличествоУпаковок;
СтрТабл.Расхождение = (СтрТабл.КоличествоФакт <> СтрТабл.Количество) Или (СтрТабл.КоличествоУпаковок <> СтрТабл.КоличествоУпаковокФакт);
СтрТабл.КоличествоУпаковокОтклонение = СтрТабл.КоличествоУпаковокФакт - СтрТабл.КоличествоУпаковок;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура НастроитьПоСкладуПомещению()
ИспользоватьАдресноеХранение = СкладыСервер.ИспользоватьАдресноеХранение(Объект.Склад,Объект.Помещение,Объект.Дата);
ИспользоватьСтатусыПересчетовТоваров = СкладыСервер.ИспользоватьСтатусыПересчетовТоваров(Объект.Склад);
УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("Склад, Помещение",Объект.Склад,Объект.Помещение));
ИспользоватьКачество = ПолучитьФункциональнуюОпцию("ИспользоватьКачествоТоваров");
Элементы.ИспользоватьЯчейкуПорчи.Видимость = ИспользоватьКачество И ИспользоватьАдресноеХранение;
Элементы.ЯчейкаКонсолидацииИспорченныхТоваров.Видимость = ИспользоватьКачество И ИспользоватьАдресноеХранение;
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ПересчетТоваров));
Элементы.Помещение.Видимость = СкладыСервер.ИспользоватьСкладскиеПомещения(Объект.Склад,Объект.Дата);
Элементы.ТоварыЯчейка.Видимость = ИспользоватьАдресноеХранение;
Элементы.ТоварыУпаковка.Видимость = ИспользоватьАдресноеХранение;
Элементы.БлокироватьЯчейки.Видимость = ИспользоватьАдресноеХранение;
Элементы.ИспользоватьЯчейкуИзлишки.Видимость = ИспользоватьАдресноеХранение;
Элементы.ЯчейкаКонсолидацииИзлишковТоваров.Видимость = ИспользоватьАдресноеХранение;
Элементы.ИспользоватьЯчейкуПорчи.Видимость = ИспользоватьАдресноеХранение;
Элементы.ЯчейкаКонсолидацииИспорченныхТоваров.Видимость = ИспользоватьАдресноеХранение;
ОтображениеДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписи();
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьКомпоновкуДанных(ВсегдаИспользоватьНастройкиПоУмолчанию)
Если ИспользоватьАдресноеХранение Тогда
СхемаКомпоновкиДанных = Документы.ПересчетТоваров.ПолучитьМакет("ОтборПересчетаПоЯчейкам");
Иначе
СхемаКомпоновкиДанных = Документы.ПересчетТоваров.ПолучитьМакет("ОтборПересчетаПоСкладу");
КонецЕсли;
URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор());
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(URLСхемы);
ОтборПересчета.Инициализировать(ИсточникНастроек);
ТекОбъект = РеквизитФормыВЗначение("Объект");
ТекНастройки = ТекОбъект.ОтборПересчета.Получить();
Если ТекНастройки = Неопределено
Или ВсегдаИспользоватьНастройкиПоУмолчанию Тогда
ОтборПересчета.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Иначе
ОтборПересчета.ЗагрузитьНастройки(ТекНастройки);
КонецЕсли;
ОтборПересчета.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);
УстановитьЗначениеПараметраНастроек(ОтборПересчета.Настройки, "Склад" , Объект.Склад);
УстановитьЗначениеПараметраНастроек(ОтборПересчета.Настройки, "Помещение", Объект.Помещение);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначениеПараметраНастроек(Настройки, ИмяПараметра, Значение)
Параметр = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
Если Параметр <> Неопределено Тогда
Параметр.Значение = Значение;
Параметр.Использование = Истина;
КонецЕсли;
КонецПроцедуры
// Возвращает состояние редактирования документа.
//
// Параметры:
// СтатусДокумента - ПеречислениеСсылка.СтатусыПересчетовТоваров - статус документа,
// ПризнакПроведенности - Булево - признак проведенности документа.
//
// Возвращаемое значение:
// Тип: Строка
//
&НаКлиентеНаСервереБезКонтекста
Функция СостояниеРедактированияДокумента(СтатусДокумента, ПризнакПроведенности, ИспользоватьСтатусыПересчетовТоваров)
Если Не ИспользоватьСтатусыПересчетовТоваров Тогда
СостояниеРедактирования = "РедактированиеБезСтатусов";
ИначеЕсли ПризнакПроведенности Тогда
Если СтатусДокумента = ПредопределенноеЗначение("Перечисление.СтатусыПересчетовТоваров.Выполнено") Тогда
СостояниеРедактирования = "НеРедактируется";
ИначеЕсли СтатусДокумента = ПредопределенноеЗначение("Перечисление.СтатусыПересчетовТоваров.ВнесениеРезультатов") Тогда
СостояниеРедактирования = "ОграниченноеРедактирование";
ИначеЕсли СтатусДокумента = ПредопределенноеЗначение("Перечисление.СтатусыПересчетовТоваров.ВРаботе") Тогда
СостояниеРедактирования = "НеРедактируется";
ИначеЕсли СтатусДокумента = ПредопределенноеЗначение("Перечисление.СтатусыПересчетовТоваров.Подготовлено") Тогда
СостояниеРедактирования = "ПолноеРедактирование";
КонецЕсли;
Иначе
СостояниеРедактирования = "ПолноеРедактирование";
КонецЕсли;
Возврат СостояниеРедактирования;
КонецФункции
&НаСервере
Процедура УстановитьСостояниеРедактированияПоСтатусу()
СостояниеРедактирования = СостояниеРедактированияДокумента(Объект.Статус, Объект.Проведен, ИспользоватьСтатусыПересчетовТоваров);
Элементы.Склад.ТолькоПросмотр = (Не СостояниеРедактирования = "ПолноеРедактирование" И Не СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.Помещение.ТолькоПросмотр = (Не СостояниеРедактирования = "ПолноеРедактирование" И Не СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.ТоварыЗаполнить.Доступность = (СостояниеРедактирования = "ПолноеРедактирование" Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.ТоварыЗаполнитьФактПоУчету.Доступность = (Объект.Статус = Перечисления.СтатусыПересчетовТоваров.ВнесениеРезультатов
Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.ИзменитьКачество.Доступность =
(СостояниеРедактирования = "ПолноеРедактирование"
Или СостояниеРедактирования = "ОграниченноеРедактирование"
Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.ТоварыРазбитьСтроку.Доступность =
(СостояниеРедактирования = "ПолноеРедактирование"
Или СостояниеРедактирования = "ОграниченноеРедактирование"
Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.ТоварыКонтекстноеМенюРазбитьСтроку.Доступность =
(СостояниеРедактирования = "ПолноеРедактирование"
Или СостояниеРедактирования = "ОграниченноеРедактирование"
Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.ТоварыПоискПоШтрихкоду.Доступность =
(СостояниеРедактирования = "ПолноеРедактирование"
Или СостояниеРедактирования = "ОграниченноеРедактирование"
Или СостояниеРедактирования = "РедактированиеБезСтатусов");
//Элементы.ТоварыЗагрузитьДанныеИзТСД.Доступность =
// (СостояниеРедактирования = "ПолноеРедактирование"
// Или СостояниеРедактирования = "ОграниченноеРедактирование"
// Или СостояниеРедактирования = "РедактированиеБезСтатусов");
//
//Элементы.ТоварыВыгрузитьДанныеВТСД.Доступность =
// (СостояниеРедактирования = "ПолноеРедактирование"
// Или СостояниеРедактирования = "ОграниченноеРедактирование"
// Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.ТоварыПолучитьВес.Доступность =
(СостояниеРедактирования = "ПолноеРедактирование"
Или СостояниеРедактирования = "ОграниченноеРедактирование"
Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.ТолькоРасхождения.Доступность = СостояниеРедактирования <> "ПолноеРедактирование";
Элементы.Товары.ИзменятьСоставСтрок =
(СостояниеРедактирования = "ПолноеРедактирование"
Или СостояниеРедактирования = "ОграниченноеРедактирование"
Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.Товары.ИзменятьПорядокСтрок =
(СостояниеРедактирования = "ПолноеРедактирование"
Или СостояниеРедактирования = "ОграниченноеРедактирование"
Или СостояниеРедактирования = "РедактированиеБезСтатусов");
Элементы.БлокироватьЯчейки.Доступность = (Объект.Статус = Перечисления.СтатусыПересчетовТоваров.ВнесениеРезультатов);
Если Не Объект.Проведен Тогда
Элементы.БлокироватьЯчейки.Доступность = Ложь;
КонецЕсли;
ОтображениеДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписи();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПризнакРасхождение()
Для Каждого СтрТабл из Объект.Товары Цикл
СтрТабл.Расхождение = СтрТабл.КоличествоФакт <> СтрТабл.Количество Или СтрТабл.КоличествоУпаковок <> СтрТабл.КоличествоУпаковокФакт;
СтрТабл.КоличествоУпаковокОтклонение = СтрТабл.КоличествоУпаковокФакт - СтрТабл.КоличествоУпаковок;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция КоличествоФактЗаполнено()
НайденныеСтроки = Объект.Товары.НайтиСтроки(Новый Структура("КоличествоФакт", 0));
Возврат НайденныеСтроки.Количество() <> Объект.Товары.Количество();
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокФакт(СтруктураДействий)
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс", "Факт");
СтруктураДействий.Вставить("ЗаполнитьФлагРасхождение");
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковокОтклонение");
КонецПроцедуры
&НаКлиенте
Функция СкладПомещениеЗаполнены()
Результат = Истина;
Если ЗначениеЗаполнено(Объект.Склад) Тогда
Если НЕ ЗначениеЗаполнено(Объект.Помещение)
И Элементы.Помещение.Видимость Тогда
Результат = Ложь;
ТекстСообщения = НСтр("ru='Не заполнено поле ""Помещение"".
|Для выполнения действия необходимо указать помещение, в котором проводится пересчет'
|;uk='Не заповнено поле ""Приміщення"".
|Для виконання дії необхідно вказати приміщення, в якому проводиться перерахунок'");
ОчиститьСообщения();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,"Помещение","Объект");
КонецЕсли;
Иначе
Результат = Ложь;
ТекстСообщения = НСтр("ru='Не заполнено поле ""Склад"".
|Для выполнения действия необходимо указать склад, на котором проводится пересчет'
|;uk='Не заповнено поле ""Склад"".
|Для виконання дії необхідно вказати склад, на якому проводиться перерахунок'");
ОчиститьСообщения();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,"Склад","Объект");
КонецЕсли;
Возврат Результат;
КонецФункции
// СтандартныеПодсистемы.Печать
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда)
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокОтклонениеПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокОтклонение(СтруктураДействий);
ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ОтображениеДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписи()
Если ЗначениеЗаполнено(Объект.Склад)
И Объект.Проведен
И Объект.Статус = Перечисления.СтатусыПересчетовТоваров.Выполнено Тогда
ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач =
СкладыСервер.ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач(Объект.Склад, Объект.Дата);
МассивСтрок = Новый Массив;
Если ИспользоватьОрдернуюСхемуПриОтраженииИзлишковНедостач
И ПравоДоступа("Использование", Метаданные.Обработки.ПомощникОформленияСкладскихАктов) Тогда
ТаблицаНоменклатуры = Обработки.ПомощникОформленияСкладскихАктов.ПолучитьСписокТоваровКОформлениюСкладскихАктов(Объект.Склад,,,Объект.Дата);
Если ТаблицаНоменклатуры.Количество() > 0 Тогда
МассивСтрок.Добавить(НСтр("ru='Не по всем расхождениям оформлены складские акты.';uk='Не по всіх розбіжностях оформлені складські акти.'")+ " ");
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(НСтр("ru='Оформить';uk='Оформити'")+Символы.ПС,,,,"ПомощникОформленияСкладскихАктов"));
МассивСтрок.Добавить("." + Символы.ПС);
КонецЕсли;
КонецЕсли;
Если ПравоДоступа("Изменение", Метаданные.Документы.ИнвентаризационнаяОпись) Тогда
ПараметрыФормирования = УправлениеПечатьюУТВызовСервера.ПолучитьПараметрыФормирования(Объект.Ссылка);
ОформленныеОписи.ЗагрузитьЗначения(ПараметрыФормирования.Описи);
ВыборкаОрганизаций = ПараметрыФормирования.Организации;
КоличествоОрганизаций = ВыборкаОрганизаций.Количество();
Если КоличествоОрганизаций > 0 Тогда
МассивСтрок.Добавить(НСтр("ru='Этот документ учитывается в';uk='Цей документ враховується в'")+ " ");
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(НСтр("ru='инвентаризационных описях';uk='інвентаризаційних описах'"),,,,"СписокОписей"));
Если ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций") Тогда
МассивСтрок.Добавить(" " + НСтр("ru='по';uk='по'")+ " " + КоличествоОрганизаций + " ");
МассивСтрок.Добавить(ОбщегоНазначенияУТКлиентСервер.СклонениеСлова(
КоличествоОрганизаций,
НСтр("ru='организации';uk='організації'"), НСтр("ru='организациям';uk='організаціям'"), НСтр("ru='организациям';uk='організаціям'"),"м"));
КонецЕсли;
МассивСтрок.Добавить(".");
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ПересчетТоваров", Объект.Ссылка);
Запрос.УстановитьПараметр("Склад", Объект.Склад);
Запрос.УстановитьПараметр("ДатаТекущегоПересчета", НачалоДня(Объект.Дата));
Запрос.УстановитьПараметр("ДатаОкончания", НачалоДня(Объект.Дата));
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПересчетТоваровТовары.Номенклатура,
| ПересчетТоваровТовары.Характеристика,
| ПересчетТоваровТовары.Серия,
| ПересчетТоваровТовары.Назначение
|ПОМЕСТИТЬ СписокТоваров
|ИЗ
| Документ.ПересчетТоваров.Товары КАК ПересчетТоваровТовары
|ГДЕ
| ПересчетТоваровТовары.Ссылка = &ПересчетТоваров
| И НЕ ПересчетТоваровТовары.Количество = ПересчетТоваровТовары.КоличествоФакт
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОприходованиеИзлишковТоваров.Ссылка.Дата КАК Дата,
| ОприходованиеИзлишковТоваров.Ссылка.Организация
|ПОМЕСТИТЬ СкладскиеАкты
|ИЗ
| Документ.ОприходованиеИзлишковТоваров.Товары КАК ОприходованиеИзлишковТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписокТоваров КАК СписокТоваров
| ПО (СписокТоваров.Номенклатура = ОприходованиеИзлишковТоваров.Номенклатура)
| И (СписокТоваров.Характеристика = ОприходованиеИзлишковТоваров.Характеристика)
| И ОприходованиеИзлишковТоваров.Серия = СписокТоваров.Серия
| И ОприходованиеИзлишковТоваров.Назначение = СписокТоваров.Назначение
|ГДЕ
| ОприходованиеИзлишковТоваров.Ссылка.Проведен
| И ОприходованиеИзлишковТоваров.Ссылка.Склад = &Склад
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| СписаниеНедостачТоваровТовары.Ссылка.Дата,
| СписаниеНедостачТоваровТовары.Ссылка.Организация
|ИЗ
| Документ.СписаниеНедостачТоваров.Товары КАК СписаниеНедостачТоваровТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписокТоваров КАК СписокТоваров
| ПО (СписокТоваров.Номенклатура = СписаниеНедостачТоваровТовары.Номенклатура)
| И (СписокТоваров.Характеристика = СписаниеНедостачТоваровТовары.Характеристика)
| И СписаниеНедостачТоваровТовары.Серия = СписокТоваров.Серия
| И СписаниеНедостачТоваровТовары.Назначение = СписокТоваров.Назначение
|ГДЕ
| СписаниеНедостачТоваровТовары.Ссылка.Проведен
| И СписаниеНедостачТоваровТовары.Ссылка.Склад = &Склад
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ПересортицаТоваровТовары.Ссылка.Дата,
| ПересортицаТоваровТовары.Ссылка.Организация
|ИЗ
| Документ.ПересортицаТоваров.Товары КАК ПересортицаТоваровТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписокТоваров КАК СписокТоваров
| ПО (СписокТоваров.Номенклатура = ПересортицаТоваровТовары.Номенклатура)
| И (СписокТоваров.Характеристика = ПересортицаТоваровТовары.Характеристика)
| И ПересортицаТоваровТовары.Серия = СписокТоваров.Серия
| И ПересортицаТоваровТовары.Назначение = СписокТоваров.Назначение
|ГДЕ
| ПересортицаТоваровТовары.Ссылка.Проведен
| И ПересортицаТоваровТовары.Ссылка.Склад = &Склад
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ПорчаТоваровТовары.Ссылка.Дата,
| ПорчаТоваровТовары.Ссылка.Организация
|ИЗ
| Документ.ПорчаТоваров.Товары КАК ПорчаТоваровТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписокТоваров КАК СписокТоваров
| ПО (СписокТоваров.Номенклатура = ПорчаТоваровТовары.Номенклатура)
| И (СписокТоваров.Характеристика = ПорчаТоваровТовары.Характеристика)
| И ПорчаТоваровТовары.Серия = СписокТоваров.Серия
| И ПорчаТоваровТовары.Назначение = СписокТоваров.Назначение
|ГДЕ
| ПорчаТоваровТовары.Ссылка.Проведен
| И ПорчаТоваровТовары.Ссылка.Склад = &Склад
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| МАКСИМУМ(СкладскиеАкты.Дата) КАК Дата,
| СкладскиеАкты.Организация
|ПОМЕСТИТЬ ОрганизацииИзАктов
|ИЗ
| СкладскиеАкты КАК СкладскиеАкты
|
|СГРУППИРОВАТЬ ПО
| СкладскиеАкты.Организация
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| ОрганизацииИзАктов.Организация
|ИЗ
| ОрганизацииИзАктов КАК ОрганизацииИзАктов
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ИнвентаризационнаяОпись КАК ИнвентаризационнаяОпись
| ПО (ИнвентаризационнаяОпись.Проведен)
| И (ИнвентаризационнаяОпись.Склад = &Склад)
| И (ИнвентаризационнаяОпись.Организация = ОрганизацииИзАктов.Организация)
| И (ОрганизацииИзАктов.Дата МЕЖДУ ИнвентаризационнаяОпись.ДатаНачала И ИнвентаризационнаяОпись.ДатаОкончания)
|ГДЕ
| ИнвентаризационнаяОпись.Ссылка ЕСТЬ NULL ";
УстановитьПривилегированныйРежим(Истина);
ВыборкаОрганизаций = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Организация");
УстановитьПривилегированныйРежим(Ложь);
ОрганизацииПоКоторымОписиОтсутсвуют.ЗагрузитьЗначения(ВыборкаОрганизаций);
КоличествоОрганизацийБезОписей = ВыборкаОрганизаций.Количество();
Если КоличествоОрганизацийБезОписей > 0 Тогда
МассивСтрок.Добавить(НСтр("ru='Необходимо';uk='Необхідно'") + " ");
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(НСтр("ru='сформировать';uk='сформувати'"),,,,"СформироватьОписи"));
МассивСтрок.Добавить(НСтр("ru=' описи по';uk=' описи по'") + " " + КоличествоОрганизацийБезОписей + " " +
ОбщегоНазначенияУТКлиентСервер.СклонениеСлова(
КоличествоОрганизацийБезОписей,
НСтр("ru='организации';uk='організації'"), НСтр("ru='организациям';uk='організаціям'"), НСтр("ru='организациям';uk='організаціям'"), "м") + ". ");
КонецЕсли;
КонецЕсли;
ИнвентаризационныйПериодНеоформленныхСкладскихАктов.ДатаНачала = НачалоДня(Объект.Дата);
ИнвентаризационныйПериодНеоформленныхСкладскихАктов.ДатаОкончания = КонецМесяца(ТекущаяДатаСеанса());
Если МассивСтрок.Количество() = 0 Тогда
Элементы.ГруппаОформитьСкладскиеАкты.ТекущаяСтраница = Элементы.ГруппаДекорацияНеВидна;
Иначе
Элементы.ГруппаОформитьСкладскиеАкты.ТекущаяСтраница = Элементы.ГруппаДекорацияВидна;
Элементы.ДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписи.Заголовок = Новый ФорматированнаяСтрока(МассивСтрок);
КонецЕсли;
Иначе
Элементы.ГруппаОформитьСкладскиеАкты.ТекущаяСтраница = Элементы.ГруппаДекорацияНеВидна;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковокОтклонение(СтруктураДействий)
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковокСуффиксИзОтклонения", "Факт");
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс", "Факт");
СтруктураДействий.Вставить("ЗаполнитьФлагРасхождение");
КонецПроцедуры
&НаКлиенте
Процедура ДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Оповещение = Новый ОписаниеОповещения("ДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписиОбработкаНавигационнойСсылкиЗАвершение", ЭтаФорма);
Если НавигационнаяСсылка = "ПомощникОформленияСкладскихАктов" Тогда
ПараметрыФормы = Новый Структура("Склад, ИнвентаризационныйПериод", Объект.Склад, ИнвентаризационныйПериодНеоформленныхСкладскихАктов);
ОткрытьФорму("Обработка.ПомощникОформленияСкладскихАктов.Форма", ПараметрыФормы, ЭтаФорма,,,,Оповещение);
ИначеЕсли НавигационнаяСсылка = "СписокОписей" Тогда
ПараметрыФормирования = Новый Структура;
ПараметрыФормирования.Вставить("ДатаНачала",ИнвентаризационныйПериодНеоформленныхСкладскихАктов.ДатаНачала);
ПараметрыФормирования.Вставить("ДатаОкончания",ИнвентаризационныйПериодНеоформленныхСкладскихАктов.ДатаОкончания);
ПараметрыФормирования.Вставить("Склад", Объект.Склад);
ПараметрыФормирования.Вставить("ОтметитьОрганизации",ОрганизацииПоКоторымОписиОтсутсвуют.ВыгрузитьЗначения());
ПараметрыФормирования.Вставить("Описи",ОформленныеОписи.ВыгрузитьЗначения());
ОткрытьФорму("Документ.ИнвентаризационнаяОпись.Форма.ФормаПечати",
ПараметрыФормирования, ЭтаФорма,,ВариантОткрытияОкна.ОтдельноеОкно,,Оповещение,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
ИначеЕсли НавигационнаяСсылка = "СформироватьОписи" Тогда
ПараметрыФормирования = Новый Структура;
ПараметрыФормирования.Вставить("ДатаНачала",ИнвентаризационныйПериодНеоформленныхСкладскихАктов.ДатаНачала);
ПараметрыФормирования.Вставить("ДатаОкончания",ИнвентаризационныйПериодНеоформленныхСкладскихАктов.ДатаОкончания);
ПараметрыФормирования.Вставить("Склад", Объект.Склад);
ПараметрыФормирования.Вставить("ОтметитьОрганизации",ОрганизацииПоКоторымОписиОтсутсвуют.ВыгрузитьЗначения());
ОткрытьФорму("Документ.ИнвентаризационнаяОпись.Форма.ФормаФормирование",
ПараметрыФормирования, ЭтаФорма,,ВариантОткрытияОкна.ОтдельноеОкно,,Оповещение,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписиОбработкаНавигационнойСсылкиЗАвершение(Результат,ДополнительныеПараментры) Экспорт
ОтображениеДекорацииЕстьТоварыКОформлениюСкладскихАктовИнвентаризационныеОписи();
КонецПроцедуры
// Конец СтандартныеПодсистемы.Печать
#КонецОбласти
#КонецОбласти
///////МОДИФИКАЦИЯ
////ОБМЕН
&НаСервереБезКонтекста
Функция СериализоватьJSON(Значение) Экспорт
Парам = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
Зп = Новый ЗаписьJSON;
Зп.УстановитьСтроку(Парам);
ЗаписатьJSON(Зп, Значение);
Возврат Зп.Закрыть();
КонецФункции
&НаСервереБезКонтекста
Функция ДесериализоватьJSON(СтрокаJSON) Экспорт
Чт = Новый ЧтениеJSON;
Чт.УстановитьСтроку(СтрокаJSON);
Значение = ПрочитатьJSON(Чт);
Чт.Закрыть();
Возврат Значение;
КонецФункции
&НаСервереБезКонтекста
Функция ВыполнитьHTTPЗапрос(Путь, Пакет) Экспорт
Ответ = Новый Структура;
Ответ.Вставить("Ошибка", Ложь);
Ответ.Вставить("Структура",Неопределено);
Ответ.Вставить("ОписаниеОшибки", Неопределено);
Пакет.Вставить("docid", "Док "+ Формат(ТекущаяДата(), "ДФ=dd:mm:ss"));//Может быть любым - но должен быть уникальным
Пакет.Вставить("info", ДопИнформация()); // Не обязательно
json = СериализоватьJSON(Пакет);
АдресСервера = "combopocket.online";
Путь = "api/"+Путь;
Соединение = Новый HTTPСоединение(АдресСервера,,, , , 10, Новый ЗащищенноеСоединениеOpenSSL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("X-Client-Type", "ComboPocketEnterprise");
Запрос = Новый HTTPЗапрос(Путь, Заголовки);
Запрос.УстановитьТелоИзСтроки(json, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
Попытка
ОтветHTTP = Соединение.ОтправитьДляОбработки(Запрос);
Если ОтветHTTP.КодСостояния = 200 Тогда
ТелоHTTP = ОтветHTTP.ПолучитьТелоКакСтроку("UTF-8");
Иначе
Ответ.Ошибка = Истина;
Ответ.ОписаниеОшибки = "Сервер работы с ТСД "+АдресСервера+" доступен, но возвращает ошибку. Код HTTP ошибки: "+ОтветHTTP.КодСостояния;
ЗаписьЖурналаРегистрации("Обращение к сервису обслуживания ТСД",УровеньЖурналаРегистрации.Ошибка,,,Ответ.ОписаниеОшибки+". "+Путь);
Возврат Ответ;
КонецЕсли;
Исключение
Ответ.Ошибка = Истина;
Ответ.ОписаниеОшибки = "Сервер работы с ТСД "+АдресСервера+" не доступен, возможно у вас проблемы с интернет";
ЗаписьЖурналаРегистрации("Обращение к сервису обслуживания ТСД",УровеньЖурналаРегистрации.Ошибка,,,Ответ.ОписаниеОшибки+". "+Путь+". "+ОписаниеОшибки());
Возврат Ответ;
КонецПопытки;
Попытка
Структура = ДесериализоватьJSON(ТелоHTTP);
Исключение
Ответ.Ошибка = Истина;
Ответ.ОписаниеОшибки = "Сервер работы с ТСД "+АдресСервера+" возвращает ответ, однако ответ не в JSON";
ЗаписьЖурналаРегистрации("Обращение к сервису обслуживания ТСД",УровеньЖурналаРегистрации.Ошибка,,,Ответ.ОписаниеОшибки+". "+Путь);
Возврат Ответ;
КонецПопытки;
Ответ.Структура = Структура;
//Обработчик ожидаемых ошибок
Если Ответ.Структура.Свойство("error") тогда
Ответ.Ошибка = Ответ.Структура.error;
Если Ответ.Структура.Свойство("error_descr") тогда
Ответ.ОписаниеОшибки = Ответ.Структура.error_descr;
КонецЕсли;
КонецЕсли;
Возврат Ответ;
КонецФункции
//Точка входа в настройки ТСД ComboPocket +++
&НаКлиенте
Процедура СписокТСДПриИзменении(Элемент)
//Удалили последнюю строку
Если СписокТСД.Количество() = 0 тогда
ТСД_Наименование = Неопределено;
ТСД_Токен = Неопределено;
СохранитьНастройки(Неопределено);
Возврат;
КонецЕсли;
Если Элемент.ТекущиеДанные = Неопределено тогда
Возврат;
КонецЕсли;
//Добавили новую, еще пустую, строку
Если Элемент.ТекущиеДанные.token = "" и Элемент.ТекущиеДанные.username = "" тогда
Возврат;
КонецЕсли;
Элемент.ТекущиеДанные.Настройки = "Настройки";
Если Элемент.ТекущиеДанные.weightSettings = "" тогда
Элемент.ТекущиеДанные.ОтображатьУчетноеКолво = Ложь;
Элемент.ТекущиеДанные.ОтображатьЦену = Ложь;
Элемент.ТекущиеДанные.РаботатьСВесовымиШтрихкодами = Истина;
Элемент.ТекущиеДанные.СобиратьНеизвестныеШтрихкоды = Истина;
Элемент.ТекущиеДанные.weightSettings ="
| [{
| ""prefix"": ""21"",
| ""skuLength"": 5,
| ""weightLength"": 5,
| ""weightDecimals"": 3
| }]";
КонецЕсли;
ТекущийТСД = Новый Структура("ТСД_Наименование, ТСД_Токен", ТСД_Наименование,ТСД_Токен);
Настройки = СериализироватьОбъекты(СписокТСД, ТекущийТСД);
СохранитьНастройки(Настройки);
НастройкиСерверные = ОбновитьНастройки(Настройки);
Если НастройкиСерверные.Ошибка тогда
Сообщить(НастройкиСерверные.ОписаниеОшибки);
Возврат;
КонецЕсли;
ЗаполнитьСписокТСД(НастройкиСерверные);
//Установка ТСД по умолчанию, если он один в таблице
Если СписокТСД.Количество() = 1 тогда
Если ЗначениеЗаполнено(Элемент.ТекущиеДанные.username) тогда
ИспользоватьЭтотТСД("");
Иначе
ТСД_Наименование = Неопределено;
ТСД_Токен = Неопределено;
КонецЕсли;
КонецЕсли;
//Пересохранение
ТекущийТСД = Новый Структура("ТСД_Наименование, ТСД_Токен", ТСД_Наименование,ТСД_Токен);
Настройки = СериализироватьОбъекты(СписокТСД, ТекущийТСД);
СохранитьНастройки(Настройки);
КонецПроцедуры
//Точка входа в настройки ТСД ComboPocket ---
&НаКлиенте
Процедура ЗаполнитьСписокТСД(НастройкиСерверные)
Для каждого СтрокаСервер Из НастройкиСерверные.Структура.tokens Цикл
СтрокаКлиент = СписокТСД.НайтиСтроки(Новый Структура("token", СтрокаСервер.token));
Если ЗначениеЗаполнено(СтрокаКлиент) тогда
ЗаполнитьЗначенияСвойств(СтрокаКлиент[0], СтрокаСервер);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция СериализироватьОбъекты(ТаблицаТокенов, ТекущийТСД)
tokens = Новый Массив;
Для каждого Строка Из ТаблицаТокенов Цикл
Структура = Новый Структура;
Структура.Вставить("token");
Структура.Вставить("storename");
Структура.Вставить("storedescr");
Структура.Вставить("ОтображатьУчетноеКолво");
Структура.Вставить("ОтображатьЦену");
Структура.Вставить("РаботатьСВесовымиШтрихкодами");
Структура.Вставить("СобиратьНеизвестныеШтрихкоды");
Структура.Вставить("weightSettings");
ЗаполнитьЗначенияСвойств(Структура,Строка);
tokens.Добавить(Структура);
КонецЦикла;
Ответ = Новый Структура;
Ответ.Вставить("tokens", tokens);
Ответ.Вставить("activeTSD", ТекущийТСД);
Возврат Ответ;
КонецФункции
&НаСервереБезКонтекста
Процедура СохранитьНастройки(Настройки) Экспорт
ХранилищеОбщихНастроек.Сохранить("ComboPocket",,Настройки);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ОбновитьНастройки(Настройки)
Возврат ОбновитьТаблицуСервер(Настройки);
КонецФункции
&НаСервереБезКонтекста
Функция ОбновитьТаблицуСервер(Настройки)
Возврат ВыполнитьHTTPЗапрос("tokenstatus", Настройки);;
КонецФункции
&НаКлиенте
Процедура ИспользоватьЭтотТСД(Команда)
Если Элементы.СписокТСД.ТекущиеДанные = Неопределено тогда
Предупреждение("Сначала добавте ТСД в список");
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Элементы.СписокТСД.ТекущиеДанные.username) тогда
ТСД_Наименование = Элементы.СписокТСД.ТекущиеДанные.storename+" : "+Элементы.СписокТСД.ТекущиеДанные.username;
ТСД_Токен = Элементы.СписокТСД.ТекущиеДанные.token;
ТекущийТСД = Новый Структура("ТСД_Наименование, ТСД_Токен", ТСД_Наименование, ТСД_Токен);
Настройки = СериализироватьОбъекты(СписокТСД, ТекущийТСД);
СохранитьНастройки(Настройки);
ОбновитьНастройки(Настройки);
Иначе
ПредупреждениеАсинх("Этот токен недействителен. Создайте новый и попробуйте снова");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДопИнформация()
//Можно отключить. Используется для анализа ошибок совместимости
log = Новый СистемнаяИнформация;
Инфо = Новый Структура;
Инфо.Вставить("OS", log.ВерсияОС);
Инфо.Вставить("app", log.ВерсияПриложения);
Инфо.Вставить("meta", Метаданные.Имя+" : "+Метаданные.Версия);
Инфо.Вставить("user", ПараметрыСеанса.ТекущийПользователь.Код);
Инфо.Вставить("epf", "BAS UT 3.2 240226");
Возврат Инфо;
КонецФункции
&НаКлиенте
Процедура СписокТСДВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Элемент.ТекущийЭлемент.Имя = "СписокТСДНастройки" тогда
Оп = Новый ОписаниеОповещения("ОбработатьПравкуНастроек", ЭтотОбъект);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("token", Элемент.ТекущиеДанные.token);
ОткрытьФорму("ВнешняяОбработка.ИнвентаризацияComboPocket.Форма.ФормаНастройкиТСД",ПараметрыОткрытия,ЭтотОбъект, Истина,,,Оп);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьПравкуНастроек(Дейсвтие, п2) Экспорт
Если Дейсвтие = "Сохранить" тогда
ТекущийТСД = Новый Структура("ТСД_Наименование, ТСД_Токен", ТСД_Наименование,ТСД_Токен);
Настройки = СериализироватьОбъекты(СписокТСД, ТекущийТСД);
СохранитьНастройки(Настройки);
НастройкиСерверные = ОбновитьНастройки(Настройки);
Если НастройкиСерверные.Ошибка тогда
Сообщить(НастройкиСерверные.ОписаниеОшибки);
Возврат;
КонецЕсли;
ЗаполнитьСписокТСД(НастройкиСерверные);
Настройки = СериализироватьОбъекты(СписокТСД, ТекущийТСД);
СохранитьНастройки(Настройки);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПересчетТоваровТекущийПриИзменении(Элемент)
ПеречитатьОбъект();
ПересчитатьФактПослеЗагрузкиТСД();
КонецПроцедуры
&НаСервере
Процедура ПеречитатьОбъект()
ТекущийДок = РеквизитФормыВЗначение("Объект");
Если ЗначениеЗаполнено(ПересчетТоваровТекущий) тогда
ТекущийДок = ПересчетТоваровТекущий.ПолучитьОбъект();;
Иначе
ТекущийДок = Документы.ПересчетТоваров.СоздатьДокумент();
КонецЕсли;
ЗначениеВРеквизитФормы(ТекущийДок, "Объект");
ПриЧтенииСозданииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура СписокТСДПослеУдаления(Элемент)
СписокТСДПриИзменении(Элемент);
КонецПроцедуры
&НаКлиенте
Процедура ОприходованиеИзлишковТоваров(Команда)
Записать();
ПараметрыОткрытия = Новый Структура("Основание", Объект.Ссылка);
ОткрытьФорму("Документ.ОприходованиеИзлишковТоваров.Форма.ФормаДокумента", ПараметрыОткрытия, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура СписаниеНедостачТоваров(Команда)
Записать();
ПараметрыОткрытия = Новый Структура("Основание", Объект.Ссылка);
ОткрытьФорму("Документ.СписаниеНедостачТоваров.Форма.ФормаДокумента", ПараметрыОткрытия, ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура СсылкаНаПолучениеТокенаНажатие(Элемент)
ЗапуститьПриложение("https://ua.combopocket.com/?source=EPF240226");
КонецПроцедуры
&НаКлиенте
Процедура СписокТСДПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
Если СписокТСД.НайтиСтроки(Новый Структура("token",Элемент.ТекущиеДанные.token)).Количество()>1 тогда
ПредупреждениеАсинх("Такой токен уже существует в таблице");
Элемент.ТекущиеДанные.token = "";
Отказ = Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
ВыполняетсяЗапись = Ложь;