Загрузка данных
////////////////////////////////////////////////////////////////////////////////
// КЛИЕНТ //
////////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭтаФорма.Ширина=30;
ЭтаФорма.Высота=50;
КонецПроцедуры
&НаКлиенте
Процедура ШтрихкодПриИзменении(Элемент)
НайтиТоварНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура НайтиТовар(Команда)
НайтиТоварНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ПодобратьЯчейку1(Команда)
ВыбраннаяЯчейка = НайтиПодходящуюЯчейку();
КонецПроцедуры
&НаКлиенте
Процедура Приемка(Команда)
Если СоздатьПриемку() Тогда
Сообщить("Товар принят");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Отгрузка(Команда)
СоздатьОтгрузку();
Сообщить("Товар отгружен");
КонецПроцедуры
&НаКлиенте
Процедура КоличествоКоробокПриИзменении(Элемент)
Строка=Коэффициент*КоличествоКоробок;
ВсегоТовара=Строка;
КонецПроцедуры
&НаКлиенте
Процедура Сканировать(Команда)
//Попытка
// // Проверяем мобильное устройство
// Если МобильноеПриложениеКлиент Тогда
// // Здесь в будущем можно подключить работу камеры
// Сообщить("Запуск камеры мобильного устройства");
// // Заглушка под результат сканирования
// Штрихкод = "";
// Иначе
// Сообщить("Камера доступна только в мобильном клиенте");
// КонецЕсли;
//Исключение
// Сообщить("Ошибка работы камеры");
//КонецПопытки;
Сообщить("Функция сканирования доступна в мобильной версии");
//Оповещение =
// Новый ОписаниеОповещения(
// "ПослеСканирования",
// ЭтотОбъект );
////СредстваМультимедиа.СканироватьШтрихкод( Оповещение );
КонецПроцедуры
&НаКлиенте
Процедура ПослеСканирования(
Результат,
ДополнительныеПараметры
)
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
// записываем код
Штрихкод = Результат;
// ищем товар
НайтиТоварНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура Инвентаризация(Команда)
СоздатьИнвентаризацию();
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ПОИСК ТОВАРА //
////////////////////////////////////////////////////////////////////////////////
&НаСервере
Процедура НайтиТоварНаСервере()
////////////////////////////////////////////////////////////////////////////
// ИЩЕМ ТОВАР ПО ШТРИХКОДУ
////////////////////////////////////////////////////////////////////////////
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Коэффициент КАК Коэффициент
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
Результат =Запрос.Выполнить().Выбрать();
////////////////////////////////////////////////////////////////////////////
// ЕСЛИ ТОВАР НАЙДЕН
////////////////////////////////////////////////////////////////////////////
Если Результат.Следующий() Тогда
ТекущийТовар =Результат.Товар;
Коэффициент = Результат.Коэффициент;
////////////////////////////////////////////////////////////////////////////
// ИЩЕМ ОСТАТКИ НА СКЛАДЕ
////////////////////////////////////////////////////////////////////////////
ЗапросОстатков = Новый Запрос;
ЗапросОстатков.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Остатки.Склад КАК Склад,
| Остатки.Ячейка КАК Ячейка,
| Остатки.КоличествоКоробокОстаток КАК Коробки,
| Остатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ОстаткиПоЯчейкам.Остатки КАК Остатки
|ГДЕ
| Остатки.Номенклатура = &Товар
| И Остатки.КоличествоКоробокОстаток > 0";
ЗапросОстатков.УстановитьПараметр( "Товар",ТекущийТовар);
РОст =ЗапросОстатков.Выполнить().Выбрать();
////////////////////////////////////////////////////////////////////////////
// ЕСЛИ ТОВАР УЖЕ ЕСТЬ НА СКЛАДЕ
////////////////////////////////////////////////////////////////////////////
Если РОст.Следующий() Тогда
// количество коробок
КоличествоКоробок =РОст.Коробки;
// всего товара
Количество =РОст.Количество;
// остаток
Остаток =РОст.Количество;
// считаем всего товара
ВсегоТовара =КоличествоКоробок* Коэффициент;
// ячейка
ВыбраннаяЯчейка =РОст.Ячейка;
// склад
Склад = РОст.Склад;
КоличествоУчет=КоличествоКоробок;
Сообщить( "Товар найден на складе" );
Иначе
////////////////////////////////////////////////////////////////////////////
// НОВЫЙ ТОВАР
////////////////////////////////////////////////////////////////////////////
КоличествоКоробок = 0;
Количество = 0;
Остаток = 0;
ВсегоТовара = 0;
ВыбраннаяЯчейка =Неопределено;
Сообщить("Новый товар");
КонецЕсли;
Иначе
////////////////////////////////////////////////////////////////////////////
// ТОВАР НЕ НАЙДЕН
////////////////////////////////////////////////////////////////////////////
Сообщить("Товар не найден" );
КонецЕсли;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ПОДБОР ЯЧЕЙКИ (ЗАПРЕТ СМЕШИВАНИЯ + ВМЕСТИМОСТЬ) //
////////////////////////////////////////////////////////////////////////////////
&НаСервере
Функция НайтиПодходящуюЯчейку()
////////////////////////////////////////////////////////////////////////////
// ПРОВЕРКИ
////////////////////////////////////////////////////////////////////////////
Если НЕ ЗначениеЗаполнено(Склад) Тогда
Сообщить("Не выбран склад");
Возврат Неопределено;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ТекущийТовар) Тогда
Сообщить("Не выбран товар");
Возврат Неопределено;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(КоличествоКоробок) Тогда
Сообщить("Не указано количество коробок");
Возврат Неопределено;
КонецЕсли;
////////////////////////////////////////////////////////////////////////////
// СКОЛЬКО НУЖНО РАЗМЕСТИТЬ
////////////////////////////////////////////////////////////////////////////
Требуется = КоличествоКоробок;
////////////////////////////////////////////////////////////////////////////
// ПОЛУЧАЕМ ЯЧЕЙКИ
////////////////////////////////////////////////////////////////////////////
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ячейки.Ссылка КАК Ячейка,
| Ячейки.ТекущийТовар КАК ТекущийТовар,
| Ячейки.Вместимость КАК Вместимость,
| Ячейки.Занято КАК Занято
|ИЗ
| Справочник.Ячейка КАК Ячейки
|ГДЕ
| Ячейки.Склад = &Склад";
Запрос.УстановитьПараметр(
"Склад",
Склад
);
Результат =
Запрос.Выполнить().Выбрать();
////////////////////////////////////////////////////////////////////////////
// ПЕРЕБИРАЕМ ЯЧЕЙКИ
////////////////////////////////////////////////////////////////////////////
Пока Результат.Следующий() Цикл
////////////////////////////////////////////////////////////////////////////
// ЗАНЯТО
////////////////////////////////////////////////////////////////////////////
Занято = 0;
Если ЗначениеЗаполнено(
Результат.Занято
) Тогда
Занято =
Результат.Занято;
КонецЕсли;
////////////////////////////////////////////////////////////////////////////
// СВОБОДНО
////////////////////////////////////////////////////////////////////////////
Свободно =
Результат.Вместимость
- Занято;
////////////////////////////////////////////////////////////////////////////
// ЕСЛИ МЕСТА НЕ ХВАТАЕТ
////////////////////////////////////////////////////////////////////////////
Если Свободно < Требуется Тогда
Продолжить;
КонецЕсли;
////////////////////////////////////////////////////////////////////////////
// ЕСЛИ ЯЧЕЙКА ПУСТАЯ
////////////////////////////////////////////////////////////////////////////
Если НЕ ЗначениеЗаполнено(
Результат.ТекущийТовар
) Тогда
Сообщить(
"Найдена ячейка: "
+ Строка(Результат.Ячейка)
+ ", свободно "
+ Строка(Свободно)
);
Возврат
Результат.Ячейка;
КонецЕсли;
////////////////////////////////////////////////////////////////////////////
// ЕСЛИ ТОВАР ОДИНАКОВЫЙ
////////////////////////////////////////////////////////////////////////////
Если Результат.ТекущийТовар.Наименование
=
ТекущийТовар.Наименование Тогда
Сообщить(
"Найдена ячейка: "
+ Строка(Результат.Ячейка)
+ ", свободно "
+ Строка(Свободно)
);
Возврат
Результат.Ячейка;
КонецЕсли;
КонецЦикла;
////////////////////////////////////////////////////////////////////////////
// НЕТ ЯЧЕЙКИ
////////////////////////////////////////////////////////////////////////////
Сообщить(
"Нет подходящей ячейки"
);
Возврат Неопределено;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
//// ПРИЕМКА (РАЗМЕЩЕНИЕ В ЯЧЕЙКУ) //
////////////////////////////////////////////////////////////////////////////////
&НаСервере
Функция СоздатьПриемку()
Если НЕ ЗначениеЗаполнено(ТекущийТовар) Тогда
Сообщить("Документ не создан. Не выбран товар.");
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(КоличествоКоробок) Или КоличествоКоробок <= 0 Тогда
Сообщить("Документ не создан. Не указано количество коробок.");
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Коэффициент) Или Коэффициент <= 0 Тогда
Сообщить("Документ не создан. Не указан коэффициент.");
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Склад) Тогда
Сообщить("Документ не создан. Не выбран склад.");
Возврат Ложь;
КонецЕсли;
ВыбраннаяЯчейка = НайтиПодходящуюЯчейку();
Если НЕ ЗначениеЗаполнено(ВыбраннаяЯчейка) Тогда
Сообщить("Нет подходящей ячейки");
Возврат Ложь;
КонецЕсли;
Всего = КоличествоКоробок * Коэффициент;
Док = Документы.ПриемкаТовара.СоздатьДокумент();
Док.Дата = ТекущаяДата();
Док.Склад = Склад;
Стр = Док.Товары.Добавить();
Стр.Номенклатура = ТекущийТовар;
Стр.КоличествоКоробок = КоличествоКоробок;
Стр.Коэффициент = Коэффициент;
Стр.Количество = Всего;
Стр.Ячейка = ВыбраннаяЯчейка;
Попытка
Док.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Документ не создан. Ошибка проведения: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
// ОБНОВЛЕНИЕ ЯЧЕЙКИ
ОбъектЯч = ВыбраннаяЯчейка.ПолучитьОбъект();
ОбъектЯч.ТекущийТовар = ТекущийТовар;
Если НЕ ЗначениеЗаполнено( ОбъектЯч.Занято) Тогда
ОбъектЯч.Занято = ОбъектЯч.Занято+КоличествоКоробок;
ОбъектЯч.Занято = 0;
КонецЕсли;
ОбъектЯч.Занято =ОбъектЯч.Занято+ КоличествоКоробок;
ОбъектЯч.Записать();
Возврат Истина;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// ОТГРУЗКА (FIFO ПО ЯЧЕЙКАМ) //
////////////////////////////////////////////////////////////////////////////////
&НаСервере
Процедура СоздатьОтгрузку()
Если НЕ ЗначениеЗаполнено(ТекущийТовар) Тогда
Сообщить("Документ не создан. Не выбран товар.");
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(КоличествоКоробок) Или КоличествоКоробок <= 0 Тогда
Сообщить("Документ не создан. Не указано количество коробок.");
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Склад) Тогда
Сообщить("Документ не создан. Не выбран склад.");
Возврат;
КонецЕсли;
Если ВсегоТовара < КоличествоКоробок Тогда
Сообщить("Документ не создан. Недостаточно товара на складе.");
Возврат;
КонецЕсли;
Зап = Новый Запрос;
Зап.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Остатки.Ячейка КАК Ячейка
|ИЗ
| РегистрНакопления.ОстаткиПоЯчейкам.Остатки КАК Остатки
|ГДЕ
| Остатки.Номенклатура = &Товар
| И Остатки.КоличествоОстаток > 0";
Зап.УстановитьПараметр("Товар", ТекущийТовар);
Р = Зап.Выполнить().Выбрать();
Если НЕ Р.Следующий() Тогда
Сообщить("Товар не найден на складе");
Возврат;
КонецЕсли;
Ячейка = Р.Ячейка;
Док = Документы.ОтгрузкаТовара.СоздатьДокумент();
Док.Дата = ТекущаяДата();
Док.Склад = Склад;
Стр = Док.Товары.Добавить();
Стр.Номенклатура = ТекущийТовар;
Стр.КоличествоКоробок = КоличествоКоробок;
Стр.Ячейка = Ячейка;
Стр.Количество=ВсегоТовара;
Попытка
Док.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Документ не создан. Ошибка проведения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// если ячейка пустая → освобождаем
ЗапЯч = Новый Запрос;
ЗапЯч.Текст =
"ВЫБРАТЬ
| СУММА(КоличествоОстаток) КАК Ост
|ИЗ
| РегистрНакопления.ОстаткиПоЯчейкам.Остатки
|ГДЕ
| Ячейка = &Ячейка";
ЗапЯч.УстановитьПараметр("Ячейка", Ячейка);
РЯ = ЗапЯч.Выполнить().Выбрать();
Ост = 0;
Если РЯ.Следующий() Тогда
Если ЗначениеЗаполнено(РЯ.Ост) Тогда
Ост = РЯ.Ост;
КонецЕсли;
КонецЕсли;
ОбъектЯч = Ячейка.ПолучитьОбъект();
// уменьшаем занятое место
ОбъектЯч.Занято =
ОбъектЯч.Занято - КоличествоКоробок;
// защита от минуса
Если ОбъектЯч.Занято < 0 Тогда
ОбъектЯч.Занято = 0;
КонецЕсли;
// если товара больше нет
Если Ост = 0 Тогда
ОбъектЯч.ТекущийТовар =
Неопределено;
КонецЕсли;
ОбъектЯч.Записать();
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
//ИНВЕНТАРИЗАЦИЯ //
////////////////////////////////////////////////////////////////////////////////
&НаСервере
Процедура СоздатьИнвентаризацию()
////////////////////////////////////////////////////////////////////////////
// ПРОВЕРКИ
////////////////////////////////////////////////////////////////////////////
Если НЕ ЗначениеЗаполнено(ТекущийТовар) Тогда
Сообщить("Документ не создан. Не выбран товар.");
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ВыбраннаяЯчейка) Тогда
Сообщить("Документ не создан. Не выбрана ячейка.");
Возврат;
КонецЕсли;
Если КоличествоФакт <= 0 Тогда
Сообщить("Документ не создан. Не введено фактическое количество.");
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Склад) Тогда
Сообщить("Документ не создан. Не выбран склад.");
Возврат;
КонецЕсли;
////////////////////////////////////////////////////////////////////////////
// СЧИТАЕМ ОТКЛОНЕНИЕ
////////////////////////////////////////////////////////////////////////////
Отклонение =
КоличествоФакт
- КоличествоУчет;
////////////////////////////////////////////////////////////////////////////
// СОЗДАЕМ ДОКУМЕНТ
////////////////////////////////////////////////////////////////////////////
Док =
Документы.ИнвентаризацияТовара.СоздатьДокумент();
Док.Дата =
ТекущаяДата();
Док.Склад =
Склад;
////////////////////////////////////////////////////////////////////////////
// ДОБАВЛЯЕМ СТРОКУ
////////////////////////////////////////////////////////////////////////////
Стр =
Док.Товары.Добавить();
Стр.Номенклатура =
ТекущийТовар;
Стр.Ячейка =
ВыбраннаяЯчейка;
Стр.КоличествоУчет =
КоличествоУчет;
Стр.КоличествоФакт =
КоличествоФакт;
Стр.Отклонение =
Отклонение;
////////////////////////////////////////////////////////////////////////////
// ЗАПИСЫВАЕМ ДОКУМЕНТ
////////////////////////////////////////////////////////////////////////////
Попытка
Док.Записать();
Исключение
Сообщить("Документ не создан. Ошибка записи: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
////////////////////////////////////////////////////////////////////////////
// СООБЩЕНИЕ
////////////////////////////////////////////////////////////////////////////
Сообщить("Инвентаризация создана" );
КонецПроцедуры