1C8 пример. Процедура автоматического создания приходного кассового ордера

Фрагмерт кода содержит примеры объединения запросов

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

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

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


    КонецЦикла;

    //Затем проверим и создадим для соблюдения нумерации не созданные ПКО по проведенным чекам
    //для текущей организации по всем подразделениям (магазинам)
    Запрос.Текст =
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   ДокЧеки.Ссылка.КассаККМ КАК КассаККМ,
    |   НАЧАЛОПЕРИОДА(ДокЧеки.Ссылка.Дата, ДЕНЬ) КАК Дата,
    |   ВЫБОР
    |       КОГДА ДокЧеки.Номенклатура.ТипНоменклатуры = 
    |           ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |           ТОГДА &СтатьяСертификат
    |       ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПриходДенежныхСредствРозничнаяВыручка)
    |   КОНЕЦ КАК СтатьяДвиженияДенежныхСредств,
    |   ВЫБОР
    |       КОГДА ДокЧеки.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |           ТОГДА ""Аванс по сертификату""
    |       ИНАЧЕ ""Розничная выручка""
    |   КОНЕЦ КАК Основание,
    |   СУММА(ДокЧеки.СуммаНаличнойОплаты) КАК СуммаНаличнойОплаты
    |ПОМЕСТИТЬ ВТЧеки
    |ИЗ
    |   Документ.ЧекККМ.Товары КАК ДокЧеки
    |ГДЕ
    |   ДокЧеки.Ссылка.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, -15) И &Дата
    |   И ДокЧеки.Ссылка.Проведен
    |
    |СГРУППИРОВАТЬ ПО
    |   ДокЧеки.Ссылка.КассаККМ,
    |   НАЧАЛОПЕРИОДА(ДокЧеки.Ссылка.Дата, ДЕНЬ),
    |   ВЫБОР
    |       КОГДА ДокЧеки.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |           ТОГДА &СтатьяСертификат
    |       ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПриходДенежныхСредствРозничнаяВыручка)
    |   КОНЕЦ,
    |   ВЫБОР
    |       КОГДА ДокЧеки.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |           ТОГДА ""Аванс по сертификату""
    |       ИНАЧЕ ""Розничная выручка""
    |   КОНЕЦ
    |
    |ИМЕЮЩИЕ
    |   СУММА(ДокЧеки.СуммаНаличнойОплаты) > 0
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
    |   ДокЧеки.Дата КАК Дата,
    |   NULL КАК Номер,
    |   ДокЧеки.КассаККМ КАК РозничнаяТочка,
    |   NULL КАК Регистратор,
    |   0 КАК СуммаВыручки,
    |   NULL КАК НомерПКО,
    |   ВЫБОР
    |       КОГДА ПКОБудущие.Ссылка ЕСТЬ NULL
    |           ТОГДА ИСТИНА
    |       ИНАЧЕ ЛОЖЬ
    |   КОНЕЦ КАК НужноСоздаватьПКО,
    |   """" КАК СсылкаПКО,
    |   ДокЧеки.СтатьяДвиженияДенежныхСредств,
    |   ДокЧеки.Основание
    |ИЗ
    |   ВТЧеки КАК ДокЧеки
    |       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
    |       ПО ДокЧеки.КассаККМ = ПриходныйКассовыйОрдер.Контрагент
    |           И (НАЧАЛОПЕРИОДА(ПриходныйКассовыйОрдер.Дата, ДЕНЬ) = ДокЧеки.Дата)
    |           И (ПриходныйКассовыйОрдер.ПометкаУдаления = ЛОЖЬ)
    |           И (ПриходныйКассовыйОрдер.ВидОперации = 
    |              ЗНАЧЕНИЕ(Перечисление.ВидыОперацийПКО.ПриходДенежныхСредствРозничнаяВыручка))
    |           И (ПриходныйКассовыйОрдер.СтатьяДвиженияДенежныхСредств = 
    |              ДокЧеки.СтатьяДвиженияДенежныхСредств)
    |       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер КАК ПКОБудущие
    |       ПО ДокЧеки.КассаККМ = ПКОБудущие.Контрагент
    |           И (НАЧАЛОПЕРИОДА(ПКОБудущие.Дата, ДЕНЬ) > ДокЧеки.Дата)
    |           И (ПКОБудущие.ПометкаУдаления = ЛОЖЬ)
    |           И (ПКОБудущие.ВидОперации = 
    |              ЗНАЧЕНИЕ(Перечисление.ВидыОперацийПКО.ПриходДенежныхСредствРозничнаяВыручка))
    |ГДЕ
    |   ПриходныйКассовыйОрдер.Ссылка ЕСТЬ NULL
    |   И ДокЧеки.КассаККМ.Владелец = &Организация
    |
    |УПОРЯДОЧИТЬ ПО
    |   Дата
    |ИТОГИ ПО
    |   Дата";

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

    //Создадим текущий документ
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |   Продажи.Регистратор.Дата КАК Дата,
    |   Продажи.Регистратор.Номер КАК Номер,
    |   Продажи.Регистратор.КассаККМ КАК РозничнаяТочка,
    |   Продажи.Регистратор,
    |   СУММА(Продажи.СуммаНаличнойОплаты) КАК СуммаВыручки,
    |   ПриходныйКассовыйОрдер.Номер КАК НомерПКО,
    |   ВЫБОР
    |       КОГДА ПриходныйКассовыйОрдер.Дата ЕСТЬ NULL
    |           ТОГДА ИСТИНА
    |       ИНАЧЕ ПриходныйКассовыйОрдер.Дата
    |   КОНЕЦ КАК НужноСоздаватьПКО,
    |   ВЫБОР
    |       КОГДА Продажи.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |           ТОГДА &СтатьяСертификат
    |       ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПриходДенежныхСредствРозничнаяВыручка)
    |   КОНЕЦ КАК СтатьяДвиженияДенежныхСредств,
    |   ВЫБОР
    |       КОГДА Продажи.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |           ТОГДА ""Аванс по сертификату""
    |       ИНАЧЕ ""Розничная выручка""
    |   КОНЕЦ КАК Основание
    |ИЗ
    |   РегистрНакопления.Продажи КАК Продажи
    |       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |           ПриходныйКассовыйОрдер.СтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств,
    |           МАКСИМУМ(ВЫБОР
    |                   КОГДА НАЧАЛОПЕРИОДА(ПриходныйКассовыйОрдер.Дата, ДЕНЬ) > &Дата
    |                       ТОГДА """"
    |                   ИНАЧЕ ПриходныйКассовыйОрдер.Номер
    |               КОНЕЦ) КАК Номер,
    |           ВЫБОР
    |               КОГДА НАЧАЛОПЕРИОДА(МАКСИМУМ(ПриходныйКассовыйОрдер.Дата), ДЕНЬ) > &Дата
    |                   ТОГДА ЛОЖЬ
    |               ИНАЧЕ ИСТИНА
    |           КОНЕЦ КАК Дата
    |       ИЗ
    |           Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
    |       ГДЕ
    |           ПриходныйКассовыйОрдер.Дата >= &Дата
    |           И ПриходныйКассовыйОрдер.Контрагент = &РозничнаяТочка
    |           И ПриходныйКассовыйОрдер.ПометкаУдаления = ЛОЖЬ
    |           И ПриходныйКассовыйОрдер.ВидОперации = 
    |             ЗНАЧЕНИЕ(Перечисление.ВидыОперацийПКО.ПриходДенежныхСредствРозничнаяВыручка)
    |
    |       СГРУППИРОВАТЬ ПО
    |           ПриходныйКассовыйОрдер.СтатьяДвиженияДенежныхСредств) КАК ПриходныйКассовыйОрдер
    |       ПО (ВЫБОР
    |               КОГДА Продажи.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |                   ТОГДА &СтатьяСертификат
    |               ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПриходДенежныхСредствРозничнаяВыручка)
    |           КОНЕЦ = ПриходныйКассовыйОрдер.СтатьяДвиженияДенежныхСредств)
    |ГДЕ
    |   Продажи.Регистратор ССЫЛКА Документ.ОтчетОРозничныхПродажах
    |   И НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) = &Дата
    |   И Продажи.Регистратор.КассаККМ = &РозничнаяТочка
    |
    |СГРУППИРОВАТЬ ПО
    |   Продажи.Регистратор.КассаККМ,
    |   Продажи.Регистратор,
    |   Продажи.Регистратор.Дата,
    |   Продажи.Регистратор.Номер,
    |   ПриходныйКассовыйОрдер.Номер,
    |   ВЫБОР
    |       КОГДА Продажи.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |           ТОГДА ""Аванс по сертификату""
    |       ИНАЧЕ ""Розничная выручка""
    |   КОНЕЦ,
    |   ВЫБОР
    |       КОГДА Продажи.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Справочник.ТипыНоменклатуры.Сертификат)
    |           ТОГДА &СтатьяСертификат
    |       ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПриходДенежныхСредствРозничнаяВыручка)
    |   КОНЕЦ,
    |   ВЫБОР
    |       КОГДА ПриходныйКассовыйОрдер.Дата ЕСТЬ NULL
    |           ТОГДА ИСТИНА
    |       ИНАЧЕ ПриходныйКассовыйОрдер.Дата
    |   КОНЕЦ
    |
    |ИМЕЮЩИЕ
    |   СУММА(Продажи.СуммаНаличнойОплаты) > 0
    |
    |УПОРЯДОЧИТЬ ПО
    |   Дата,
    |   Номер";

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

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




Рекламный блок:

Предлагаем решение Ваших задач 1С.

Внедрение 1С:

Доработка и сопровождение 1С:

Ориентировочная стоимость работ программиста 1С : 500 р. за 1 час работы.

Пишите: j008@j008.ru

Звоните: 8 916 710 83 51 Ольга