Загрузка данных


////////////////////////////////////////////////////////////////////////////////
// КЛИЕНТ                                                                     //
////////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ЭтаФорма.Ширина=30;
	ЭтаФорма.Высота=50;
КонецПроцедуры

&НаКлиенте
Процедура ШтрихкодПриИзменении(Элемент)
    НайтиТоварНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура НайтиТовар(Команда) 
    НайтиТоварНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ПодобратьЯчейку1(Команда)
    ВыбраннаяЯчейка = НайтиПодходящуюЯчейку();
КонецПроцедуры

&НаКлиенте
Процедура Приемка(Команда)

    Если СоздатьПриемку() Тогда
        Сообщить("Товар принят");
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Отгрузка(Команда)

    СоздатьОтгрузку();
    Сообщить("Товар отгружен");

КонецПроцедуры

&НаКлиенте
Процедура КоличествоКоробокПриИзменении(Элемент)
	Строка=Коэффициент*КоличествоКоробок;
	ВсегоТовара=Строка;
КонецПроцедуры

&НаКлиенте
Процедура Сканировать(Команда)

	//Попытка

	//    // Проверяем мобильное устройство
	//    Если МобильноеПриложениеКлиент Тогда

	//        // Здесь в будущем можно подключить работу камеры
	//        Сообщить("Запуск камеры мобильного устройства");

	//        // Заглушка под результат сканирования
	//        Штрихкод = "";

	//    Иначе

	//        Сообщить("Камера доступна только в мобильном клиенте");

	//    КонецЕсли;

	//Исключение

	//    Сообщить("Ошибка работы камеры");

	//КонецПопытки;
	
	Сообщить("Функция сканирования доступна в мобильной версии");
	//Оповещение =
	//    Новый ОписаниеОповещения(
	//        "ПослеСканирования",
	//        ЭтотОбъект );

	////СредстваМультимедиа.СканироватьШтрихкод( Оповещение );
КонецПроцедуры

 &НаКлиенте
Процедура ПослеСканирования(
    Результат,
    ДополнительныеПараметры
)

    Если Результат = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // записываем код
    Штрихкод = Результат;

    // ищем товар
    НайтиТоварНаСервере();

КонецПроцедуры

&НаКлиенте
Процедура Инвентаризация(Команда)
СоздатьИнвентаризацию();
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ПОИСК ТОВАРА                                                               //
////////////////////////////////////////////////////////////////////////////////

&НаСервере
Процедура НайтиТоварНаСервере()

    ////////////////////////////////////////////////////////////////////////////
    // ИЩЕМ ТОВАР ПО ШТРИХКОДУ
    ////////////////////////////////////////////////////////////////////////////

    Запрос = Новый Запрос;

    Запрос.Текст =
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Товар,
    |   Номенклатура.Коэффициент КАК Коэффициент
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.Штрихкод = &Штрихкод";

    Запрос.УстановитьПараметр("Штрихкод", Штрихкод);

    Результат =Запрос.Выполнить().Выбрать();

    ////////////////////////////////////////////////////////////////////////////
    // ЕСЛИ ТОВАР НАЙДЕН
    ////////////////////////////////////////////////////////////////////////////

    Если Результат.Следующий() Тогда

        ТекущийТовар =Результат.Товар;

        Коэффициент = Результат.Коэффициент;  

        ////////////////////////////////////////////////////////////////////////////
        // ИЩЕМ ОСТАТКИ НА СКЛАДЕ
        ////////////////////////////////////////////////////////////////////////////

        ЗапросОстатков = Новый Запрос;

        ЗапросОстатков.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	Остатки.Склад КАК Склад,
        |	Остатки.Ячейка КАК Ячейка,
        |	Остатки.КоличествоКоробокОстаток КАК Коробки,
        |	Остатки.КоличествоОстаток КАК Количество
        |ИЗ
        |	РегистрНакопления.ОстаткиПоЯчейкам.Остатки КАК Остатки
        |ГДЕ
        |	Остатки.Номенклатура = &Товар
        |	И Остатки.КоличествоКоробокОстаток > 0";

        ЗапросОстатков.УстановитьПараметр( "Товар",ТекущийТовар);

        РОст =ЗапросОстатков.Выполнить().Выбрать();

        ////////////////////////////////////////////////////////////////////////////
        // ЕСЛИ ТОВАР УЖЕ ЕСТЬ НА СКЛАДЕ
        ////////////////////////////////////////////////////////////////////////////

      Если РОст.Следующий() Тогда

            // количество коробок

            КоличествоКоробок =РОст.Коробки;

            // всего товара

            Количество =РОст.Количество;

            // остаток

            Остаток =РОст.Количество;

            // считаем всего товара

            ВсегоТовара =КоличествоКоробок* Коэффициент;

            // ячейка

            ВыбраннаяЯчейка =РОст.Ячейка;

            // склад

            Склад = РОст.Склад;
			
			КоличествоУчет=КоличествоКоробок;
            Сообщить( "Товар найден на складе" );

        Иначе

            ////////////////////////////////////////////////////////////////////////////

            // НОВЫЙ ТОВАР

            ////////////////////////////////////////////////////////////////////////////

            КоличествоКоробок = 0;

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

            Остаток = 0;

            ВсегоТовара = 0;

            ВыбраннаяЯчейка =Неопределено;

            Сообщить("Новый товар");

        КонецЕсли;

    Иначе

        ////////////////////////////////////////////////////////////////////////////

        // ТОВАР НЕ НАЙДЕН

        ////////////////////////////////////////////////////////////////////////////

        Сообщить("Товар не найден" );

    КонецЕсли;

КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////
// ПОДБОР ЯЧЕЙКИ (ЗАПРЕТ СМЕШИВАНИЯ + ВМЕСТИМОСТЬ)                            //
////////////////////////////////////////////////////////////////////////////////

&НаСервере
Функция НайтиПодходящуюЯчейку()

    ////////////////////////////////////////////////////////////////////////////
    // ПРОВЕРКИ
    ////////////////////////////////////////////////////////////////////////////

    Если НЕ ЗначениеЗаполнено(Склад) Тогда
        Сообщить("Не выбран склад");
        Возврат Неопределено;
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(ТекущийТовар) Тогда
        Сообщить("Не выбран товар");
        Возврат Неопределено;
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(КоличествоКоробок) Тогда
        Сообщить("Не указано количество коробок");
        Возврат Неопределено;
    КонецЕсли;

    ////////////////////////////////////////////////////////////////////////////
    // СКОЛЬКО НУЖНО РАЗМЕСТИТЬ
    ////////////////////////////////////////////////////////////////////////////

    Требуется = КоличествоКоробок;

    ////////////////////////////////////////////////////////////////////////////
    // ПОЛУЧАЕМ ЯЧЕЙКИ
    ////////////////////////////////////////////////////////////////////////////

    Запрос = Новый Запрос;

    Запрос.Текст =
    "ВЫБРАТЬ
    |   Ячейки.Ссылка КАК Ячейка,
    |   Ячейки.ТекущийТовар КАК ТекущийТовар,
    |   Ячейки.Вместимость КАК Вместимость,
    |   Ячейки.Занято КАК Занято
    |ИЗ
    |   Справочник.Ячейка КАК Ячейки
    |ГДЕ
    |   Ячейки.Склад = &Склад";

    Запрос.УстановитьПараметр(
        "Склад",
        Склад
    );

    Результат =
        Запрос.Выполнить().Выбрать();

    ////////////////////////////////////////////////////////////////////////////
    // ПЕРЕБИРАЕМ ЯЧЕЙКИ
    ////////////////////////////////////////////////////////////////////////////

    Пока Результат.Следующий() Цикл

        ////////////////////////////////////////////////////////////////////////////
        // ЗАНЯТО
        ////////////////////////////////////////////////////////////////////////////

        Занято = 0;

        Если ЗначениеЗаполнено(
            Результат.Занято
        ) Тогда

            Занято =
                Результат.Занято;

        КонецЕсли;

        ////////////////////////////////////////////////////////////////////////////
        // СВОБОДНО
        ////////////////////////////////////////////////////////////////////////////

        Свободно =
            Результат.Вместимость
            - Занято;

        ////////////////////////////////////////////////////////////////////////////
        // ЕСЛИ МЕСТА НЕ ХВАТАЕТ
        ////////////////////////////////////////////////////////////////////////////

        Если Свободно < Требуется Тогда
            Продолжить;
        КонецЕсли;

        ////////////////////////////////////////////////////////////////////////////
        // ЕСЛИ ЯЧЕЙКА ПУСТАЯ
        ////////////////////////////////////////////////////////////////////////////

        Если НЕ ЗначениеЗаполнено(
            Результат.ТекущийТовар
        ) Тогда

            Сообщить(
                "Найдена ячейка: "
                + Строка(Результат.Ячейка)
                + ", свободно "
                + Строка(Свободно)
            );

            Возврат
                Результат.Ячейка;

        КонецЕсли;

        ////////////////////////////////////////////////////////////////////////////
        // ЕСЛИ ТОВАР ОДИНАКОВЫЙ
        ////////////////////////////////////////////////////////////////////////////

        Если Результат.ТекущийТовар.Наименование
            =
           ТекущийТовар.Наименование Тогда

            Сообщить(
                "Найдена ячейка: "
                + Строка(Результат.Ячейка)
                + ", свободно "
                + Строка(Свободно)
            );

            Возврат
                Результат.Ячейка;

        КонецЕсли;

    КонецЦикла;

    ////////////////////////////////////////////////////////////////////////////
    // НЕТ ЯЧЕЙКИ
    ////////////////////////////////////////////////////////////////////////////

    Сообщить(
        "Нет подходящей ячейки"
    );

    Возврат Неопределено;

КонецФункции


////////////////////////////////////////////////////////////////////////////////	
//// ПРИЕМКА (РАЗМЕЩЕНИЕ В ЯЧЕЙКУ)                                            //
////////////////////////////////////////////////////////////////////////////////

&НаСервере
Функция СоздатьПриемку()

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

Если НЕ ЗначениеЗаполнено(КоличествоКоробок) Или КоличествоКоробок <= 0 Тогда
    Сообщить("Документ не создан. Не указано количество коробок.");
    Возврат Ложь;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Коэффициент) Или Коэффициент <= 0 Тогда
    Сообщить("Документ не создан. Не указан коэффициент.");
    Возврат Ложь;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Склад) Тогда
    Сообщить("Документ не создан. Не выбран склад.");
    Возврат Ложь;
КонецЕсли;

    ВыбраннаяЯчейка = НайтиПодходящуюЯчейку();

    Если НЕ ЗначениеЗаполнено(ВыбраннаяЯчейка) Тогда
        Сообщить("Нет подходящей ячейки");
        Возврат Ложь;
    КонецЕсли;

    Всего = КоличествоКоробок * Коэффициент;

    Док = Документы.ПриемкаТовара.СоздатьДокумент();
    Док.Дата = ТекущаяДата();
    Док.Склад = Склад;

    Стр = Док.Товары.Добавить();
    Стр.Номенклатура = ТекущийТовар;  
    Стр.КоличествоКоробок = КоличествоКоробок;
    Стр.Коэффициент = Коэффициент;
    Стр.Количество = Всего;
    Стр.Ячейка = ВыбраннаяЯчейка;
  Попытка
    Док.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    Сообщить("Документ не создан. Ошибка проведения: " + ОписаниеОшибки());
    Возврат Ложь;
КонецПопытки;
   
    // ОБНОВЛЕНИЕ ЯЧЕЙКИ
    ОбъектЯч = ВыбраннаяЯчейка.ПолучитьОбъект();
     ОбъектЯч.ТекущийТовар = ТекущийТовар;
	Если НЕ ЗначениеЗаполнено( ОбъектЯч.Занято) Тогда

 ОбъектЯч.Занято = ОбъектЯч.Занято+КоличествоКоробок;
   ОбъектЯч.Занято = 0;

КонецЕсли;
   ОбъектЯч.Занято =ОбъектЯч.Занято+ КоличествоКоробок;

    ОбъектЯч.Записать();

    Возврат Истина;

  КонецФункции

////////////////////////////////////////////////////////////////////////////////
// ОТГРУЗКА (FIFO ПО ЯЧЕЙКАМ)                                                 //
////////////////////////////////////////////////////////////////////////////////

&НаСервере
Процедура СоздатьОтгрузку()

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

Если НЕ ЗначениеЗаполнено(КоличествоКоробок) Или КоличествоКоробок <= 0 Тогда
    Сообщить("Документ не создан. Не указано количество коробок.");
    Возврат;
КонецЕсли;

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

    Зап.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   Остатки.Ячейка КАК Ячейка
    |ИЗ
    |   РегистрНакопления.ОстаткиПоЯчейкам.Остатки КАК Остатки
    |ГДЕ
    |   Остатки.Номенклатура = &Товар
    |   И Остатки.КоличествоОстаток > 0";

    Зап.УстановитьПараметр("Товар", ТекущийТовар);

    Р = Зап.Выполнить().Выбрать();

    Если НЕ Р.Следующий() Тогда
        Сообщить("Товар не найден на складе");
        Возврат;
    КонецЕсли;

    Ячейка = Р.Ячейка;

    Док = Документы.ОтгрузкаТовара.СоздатьДокумент();
    Док.Дата = ТекущаяДата();
    Док.Склад = Склад;

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

    // если ячейка пустая → освобождаем
    ЗапЯч = Новый Запрос;
    ЗапЯч.Текст =
    "ВЫБРАТЬ
    |   СУММА(КоличествоОстаток) КАК Ост
    |ИЗ
    |   РегистрНакопления.ОстаткиПоЯчейкам.Остатки
    |ГДЕ
    |   Ячейка = &Ячейка";

    ЗапЯч.УстановитьПараметр("Ячейка", Ячейка);

    РЯ = ЗапЯч.Выполнить().Выбрать();

    Ост = 0;

    Если РЯ.Следующий() Тогда
        Если ЗначениеЗаполнено(РЯ.Ост) Тогда
            Ост = РЯ.Ост;
        КонецЕсли;
    КонецЕсли;

  
      ОбъектЯч = Ячейка.ПолучитьОбъект();

// уменьшаем занятое место
ОбъектЯч.Занято =
    ОбъектЯч.Занято - КоличествоКоробок;

// защита от минуса
Если ОбъектЯч.Занято < 0 Тогда
    ОбъектЯч.Занято = 0;
КонецЕсли;

// если товара больше нет
Если Ост = 0 Тогда

    ОбъектЯч.ТекущийТовар =
        Неопределено;

КонецЕсли;

ОбъектЯч.Записать();

КонецПроцедуры



////////////////////////////////////////////////////////////////////////////////
//ИНВЕНТАРИЗАЦИЯ                                                              //
////////////////////////////////////////////////////////////////////////////////

&НаСервере
Процедура СоздатьИнвентаризацию()      
	
   ////////////////////////////////////////////////////////////////////////////
// ПРОВЕРКИ
////////////////////////////////////////////////////////////////////////////
Если НЕ ЗначениеЗаполнено(ТекущийТовар) Тогда
    Сообщить("Документ не создан. Не выбран товар.");
    Возврат;
КонецЕсли;

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

Если КоличествоФакт <= 0 Тогда
    Сообщить("Документ не создан. Не введено фактическое количество.");
    Возврат;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Склад) Тогда
    Сообщить("Документ не создан. Не выбран склад.");
    Возврат;
КонецЕсли;
    ////////////////////////////////////////////////////////////////////////////
    // СЧИТАЕМ ОТКЛОНЕНИЕ
    ////////////////////////////////////////////////////////////////////////////

    Отклонение =
        КоличествоФакт
        - КоличествоУчет;

    ////////////////////////////////////////////////////////////////////////////
    // СОЗДАЕМ ДОКУМЕНТ
    ////////////////////////////////////////////////////////////////////////////

    Док =
        Документы.ИнвентаризацияТовара.СоздатьДокумент();

    Док.Дата =
        ТекущаяДата();

    Док.Склад =
        Склад;

    ////////////////////////////////////////////////////////////////////////////
    // ДОБАВЛЯЕМ СТРОКУ
    ////////////////////////////////////////////////////////////////////////////

    Стр =
        Док.Товары.Добавить();

    Стр.Номенклатура =
        ТекущийТовар;

    Стр.Ячейка =
        ВыбраннаяЯчейка;

    Стр.КоличествоУчет =
        КоличествоУчет;

    Стр.КоличествоФакт =
        КоличествоФакт;

    Стр.Отклонение =
        Отклонение;

    ////////////////////////////////////////////////////////////////////////////
    // ЗАПИСЫВАЕМ ДОКУМЕНТ
    ////////////////////////////////////////////////////////////////////////////

   Попытка
    Док.Записать();
Исключение
    Сообщить("Документ не создан. Ошибка записи: " + ОписаниеОшибки());
    Возврат;
КонецПопытки; 

    ////////////////////////////////////////////////////////////////////////////
    // СООБЩЕНИЕ
    ////////////////////////////////////////////////////////////////////////////

    Сообщить("Инвентаризация создана" );

КонецПроцедуры