1С Режим Конфигуратор

       

Дополнение


Товар

Товар

С.Номенклатура



Сорт

Сорт товара

С.Сорт

Кол

Количество в произвольной ед. измерения

Число 8.2

+

Ед

Единица измерения

С.Единицы

КолО

Количество в основной ед. измерения

Число 8.2

+,И

Цена

Цена учета

Число 7.2

+

Сумма

Сумма документа

Число 15.2

+,И

  • Создаем новый документ;
  • В окне свойств документа указываем его настройки и вводим реквизиты;
  • Нажимаем [Ввод на основании...];
  • Ставим галочку в колонке "Вводить на основании" напротив "ПриходнаяНакладная";
  • [ОК];
  • Форму документа сделаем аналогичной расходной накладной. Колонка "Цена" и поле ввода "НомерДок" недоступны;
  • Процедуры на элементы формы документа напишем по аналогии с приходной и расходной накладной. Учтем что мы будем использовать цену ЦенаП;
  • Добавим кнопку [Подбор] и пропишем для нее процедуры. Только Склад заменим в них на СкладО;
  • Теперь пропишем процедуру ввода на основании:

    Процедура ВводНаОсновании(ДокОсн)

    // предопределенная процедура. ДокОсн – ссылка на документ,

    // на основании которого мы хотим ввести текущий

    // если мы хотим, чтобы и в дальнейшем эти документы

    // были между собой связаны, надо в документе, вводимом на

    // основании завести реквизит типа документа основания

    // и сохранять там эту ссылку

      Если ДокОсн.Проведен()<>1 Тогда

    // Если документ основание не проведен

    // мы не можем ввести на его основании никакой документ

        Предупреждение("Приходная накладная № "+Строка(ДокОсн.НомерДок) +"

                    |    от "+Строка(ДокОсн.ДатаДок)+"

                    |    не проведена!");

        СтатусВозврата(0);

      КонецЕсли;

      ДатаДок=РабочаяДата();

    // копируем реквизиты шапки

      СкладО=ДокОсн.Склад;

      СкладП="";

      Пока ДокОсн.ПолучитьСтроку()=1 Цикл




    // копируем содержимое строк

        НоваяСтрока();

        Товар=ДокОсн.Товар;

        Сорт=ДокОсн.Сорт;

        Кол=ДокОсн.Кол;

        Ед=ДокОсн.Ед;

        КолО=ДокОсн.КолО;

        Цена=Товар.ЦенаП.Получить(ДатаДок);

        Сумма=Окр(КолО*Цена,2,1);

      КонецЦикла;

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


  • Процедуру проведения пишем по аналогии с расходной накладной:

    Процедура ОбработкаПроведения()

      РегОст=СоздатьОбъект("Регистр.ОстаткиТоваров");

      Если СравнитьТА()=-1 Тогда

        РегОст.ВременныйРасчет(1);

        РассчитатьРегистрыНа(ТекущийДокумент());

      КонецЕсли;

    // Проверка на наличие на остатке

      ВыбратьСтроки();

      ФлагОтказа=0;

      Пока (ПолучитьСтроку()>0) Цикл

        Остат=РегОст.СводныйОстаток(СкладО,Товар,Сорт,,"Количество");

        Если Остат<КолО Тогдаbr>       Сообщить("Нет товара № "+СокрЛП(Товар.Код)+"/"

                  +СокрЛП(Сорт.Наименование)+" в колич. "

                  +КолО+" (имеется "+Остат+")");

          ФлагОтказа=1;

        КонецЕсли;

      КонецЦикла;

      Если ФлагОтказа=1 Тогда

        НеПроводитьДокумент();

        Возврат;

      КонецЕсли;

      Если Константа.МетодСписания=Перечисление.МетодСписания.ФИФО Тогда

    // Здесь будет записана методика списания по FIFO

        ВыбратьСтроки();

        Пока ПолучитьСтроку()=1 Цикл

          КолСпис=КолО;

          Запрос="";

          ТекстЗапроса="";

          Если ИтогиАктуальны()=0 Тогда

            ТекстЗапроса="

            |Период с ДатаДок по ДатаДок;";

          КонецЕсли;

          ТекстЗапроса=ТекстЗапроса+"

          |РегСклад=Регистр.ОстаткиТоваров.Склад;



          |РегТовар=Регистр.ОстаткиТоваров.Товар;

          |РегСорт=Регистр.ОстаткиТоваров.Сорт;

          |РегПартия=Регистр.ОстаткиТоваров.Партия;

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

          |РегСумма=Регистр.ОстаткиТоваров.СуммаП;

          | Группировка РегПартия Упорядочить по РегПартия.ДатаДок;

          |Функция КолКонОст=КонОст(РегКолич);

          |Функция СумКонОст=КонОст(РегСумма);

          |Условие (РегСклад=СкладО);

          |Условие (РегТовар=Товар);

          |Условие (РегСорт=Сорт);";

          Запрос=СоздатьОбъект("Запрос");

          Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда

            Сообщить("Документ не проведен");

            НеПроводитьДокумент();

            Возврат;

          КонецЕсли;

          Пока Запрос.Группировка("РегПартия",1)=1 Цикл

    // Сортируем группировку по возрастанию

            Если КолСпис=0 Тогда

              Прервать;

            КонецЕсли;

            ПартияСписания=Запрос.РегПартия;

            Если  Запрос.КолКонОст>КолСпис Тогда

              Списывать=КолСпис;

              Стоимость=Окр((Запрос.СумКонОст/Запрос.КолКонОст)

              *Списывать,2,1);

            ИначеЕсли Запрос.КолКонОст=КолСпис Тогда

              Списывать=КолСпис;

              Стоимость=Запрос.СумКонОст;

            ИначеЕсли Запрос.КолКонОст<КолСпис Тогдаbr>           Списывать=Запрос.КолКонОст;

              Стоимость=Запрос.СумКонОст;

            КонецЕсли;



            КолСпис=КолСпис-Списывать;

            Регистр.ОстаткиТоваров.Склад = СкладО;

    // по одному складу

            Регистр.ОстаткиТоваров.Товар = Товар;

            Регистр.ОстаткиТоваров.Сорт = Сорт;

            Регистр.ОстаткиТоваров.Партия = ПартияСписания;

            Регистр.ОстаткиТоваров.Количество = Списывать;

            Регистр.ОстаткиТоваров.СуммаП = Стоимость;

            Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Списывать,2,1);

            Регистр.ОстаткиТоваров.ФлагДвижения = 2;

    // у нас движение внутреннее

            Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

            Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();

            Регистр.ОстаткиТоваров.Склад = СкладП;

    // по другому складу

            Регистр.ОстаткиТоваров.Товар = Товар;

            Регистр.ОстаткиТоваров.Сорт = Сорт;

            Регистр.ОстаткиТоваров.Партия = ПартияСписания;

            Регистр.ОстаткиТоваров.Количество = Списывать;

            Регистр.ОстаткиТоваров.СуммаП = Стоимость;

            Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Списывать,2,1);

            Регистр.ОстаткиТоваров.ФлагДвижения = 2;

            Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

            Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();

            Регистр.ОборотыТоваров.Склад = СкладО;

            Регистр.ОборотыТоваров.Товар = Товар;

            Регистр.ОборотыТоваров.Сорт = Сорт;

            Регистр.ОборотыТоваров.Количество = Списывать;

            Регистр.ОборотыТоваров.СуммаУ = Стоимость;

            Регистр.ОборотыТоваров.ФлагДвижения = 2;



            Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);

            Регистр.ОборотыТоваров.ДвижениеВыполнить();

            Регистр.ОборотыТоваров.Склад = СкладП;

            Регистр.ОборотыТоваров.Товар = Товар;

            Регистр.ОборотыТоваров.Сорт = Сорт;

            Регистр.ОборотыТоваров.Количество = Списывать;

            Регистр.ОборотыТоваров.СуммаУ = Стоимость;

            Регистр.ОборотыТоваров.ФлагДвижения = 2;

            Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);

            Регистр.ОборотыТоваров.ДвижениеВыполнить();

          КонецЦикла;

        КонецЦикла;

      ИначеЕсли Константа.МетодСписания=Перечисление.МетодСписания.ЛИФО Тогда

    // Здесь будет записана методика списания по LIFO

        ТабЗн1=СоздатьОбъект("ТаблицаЗначений");

        ТабЗн2=СоздатьОбъект("ТаблицаЗначений");

        ТабЗн2.НоваяКолонка("Партия","Документ.ПриходнаяНакладная");

        ТабЗн2.НоваяКолонка("КоличествоП","Число",14,2);

        ТабЗн2.НоваяКолонка("СуммаП","Число",19,2);

        ВыбратьСтроки();

        Пока ПолучитьСтроку() = 1 Цикл

          КолВыб=КолО;

          РегОст.УстановитьФильтр(СкладО,Товар,Сорт);

          РегОст.ВыгрузитьИтоги(ТабЗн1,1,1);

          ТабЗн1.Свернуть("4","5,6");

          ТабЗн1.ВыбратьСтроки();

          Пока ТабЗн1.ПолучитьСтроку()=1 Цикл

            Прт=ТабЗн1.Партия;

            Ост=ТабЗн1.Количество;

            Сум=ТабЗн1.СуммаП;

            Если Ост>0 Тогда // есть что проверять

              ТабЗн2.НоваяСтрока();



              ТабЗн2.Партия=Прт;

              ТабЗн2.КоличествоП=Ост;

              ТабЗн2.СуммаП=Сум;

            КонецЕсли;

          КонецЦикла;

          ТабЗн1.Очистить();

          ТабЗн2.Сортировать("1-",1);

    // Способ сортировки по убывающей (-)

          ТабЗн2.ВыбратьСтроки();

          Пока ТабЗн2.ПолучитьСтроку()=1 Цикл

            Ост=ТабЗн2.КоличествоП;

            Сум=ТабЗн2.СуммаП;

            ЦенаПП=Окр(Сум/Ост,2,1);

            Парт=ТабЗн2.Партия;

            Если КолВыб>Ост Тогда // Ост

              Регистр.ОстаткиТоваров.Склад = СкладО;

              Регистр.ОстаткиТоваров.Товар = Товар;

              Регистр.ОстаткиТоваров.Сорт = Сорт;

              Регистр.ОстаткиТоваров.Партия = Парт;

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

              Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*Ост,2,1);

              Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Ост,2,1);

              Регистр.ОстаткиТоваров.ФлагДвижения = 2;

              Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

              Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();

              Регистр.ОстаткиТоваров.Склад = СкладП;

              Регистр.ОстаткиТоваров.Товар = Товар;

              Регистр.ОстаткиТоваров.Сорт = Сорт;

              Регистр.ОстаткиТоваров.Партия = Парт;

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

              Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*Ост,2,1);



              Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*Ост,2,1);

              Регистр.ОстаткиТоваров.ФлагДвижения = 2;

              Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

              Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();

              Регистр.ОборотыТоваров.Склад = СкладО;

              Регистр.ОборотыТоваров.Товар = Товар;

              Регистр.ОборотыТоваров.Сорт = Сорт;

              Регистр.ОборотыТоваров.Количество = Ост;

              Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*Ост,2,1);

              Регистр.ОборотыТоваров.ФлагДвижения = 2;

              Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);

              Регистр.ОборотыТоваров.ДвижениеВыполнить();

              Регистр.ОборотыТоваров.Склад = СкладП;

              Регистр.ОборотыТоваров.Товар = Товар;

              Регистр.ОборотыТоваров.Сорт = Сорт;

              Регистр.ОборотыТоваров.Количество = Ост;

              Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*Ост,2,1);

              Регистр.ОборотыТоваров.ФлагДвижения = 2;

              Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);

              Регистр.ОборотыТоваров.ДвижениеВыполнить();

              КолВыб=КолВыб-Ост;

            Иначе

              Если КолВыб> 0 Тогда // КолВыб

                Регистр.ОстаткиТоваров.Склад = СкладО;

                Регистр.ОстаткиТоваров.Товар = Товар;

                Регистр.ОстаткиТоваров.Сорт = Сорт;



                Регистр.ОстаткиТоваров.Партия = Парт;

                Регистр.ОстаткиТоваров.Количество = КолВыб;

                Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*КолВыб,2,1);

                Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолВыб,2,1);

                Регистр.ОстаткиТоваров.ФлагДвижения = 2;

                Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

                Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();

                Регистр.ОстаткиТоваров.Склад = СкладП;

                Регистр.ОстаткиТоваров.Товар = Товар;

                Регистр.ОстаткиТоваров.Сорт = Сорт;

                Регистр.ОстаткиТоваров.Партия = Парт;

                Регистр.ОстаткиТоваров.Количество = КолВыб;

                Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенаПП*КолВыб,2,1);

                Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолВыб,2,1);

                Регистр.ОстаткиТоваров.ФлагДвижения = 2;

                Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

                Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();

                Регистр.ОборотыТоваров.Склад = СкладО;

                Регистр.ОборотыТоваров.Товар = Товар;

                Регистр.ОборотыТоваров.Сорт = Сорт;

                Регистр.ОборотыТоваров.Количество = КолВыб;

                Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*КолВыб,2,1);

                Регистр.ОборотыТоваров.ФлагДвижения = 2;



                Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);

                Регистр.ОборотыТоваров.ДвижениеВыполнить();

                Регистр.ОборотыТоваров.Склад = СкладП;

                Регистр.ОборотыТоваров.Товар = Товар;

                Регистр.ОборотыТоваров.Сорт = Сорт;

                Регистр.ОборотыТоваров.Количество = КолВыб;

                Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенаПП*КолВыб,2,1);

                Регистр.ОборотыТоваров.ФлагДвижения = 2;

                Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);

                Регистр.ОборотыТоваров.ДвижениеВыполнить();

                КолВыб=КолВыб-Ост;

              КонецЕсли;

            КонецЕсли;

          КонецЦикла;

          ТабЗн2.УдалитьСтроки();

        КонецЦикла;

      ИначеЕсли

        Константа.МетодСписания=Перечисление.МетодСписания.По_среднему Тогда

    // Здесь будет записана методика списания по-среднему

        ВыбратьСтроки();

        Пока ПолучитьСтроку() = 1 Цикл

          КолОст=РегОст.СводныйОстаток(СкладО,Товар,Сорт,,"Количество");

          СумОст=РегОст.СводныйОстаток(СкладО,Товар,Сорт,,"СуммаП");

          ЦенОст=Окр(СумОст/КолОст,2,1);

          Парт=ПолучитьПустоеЗначение("Документ.ПриходнаяНакладная");

          Регистр.ОстаткиТоваров.Склад = СкладО;

          Регистр.ОстаткиТоваров.Товар = Товар;

          Регистр.ОстаткиТоваров.Сорт = Сорт;

          Регистр.ОстаткиТоваров.Партия = Парт;

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



          Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенОст*КолО,2,1);

          Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолО,2,1);

          Регистр.ОстаткиТоваров.ФлагДвижения = 2;

          Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

          Регистр.ОстаткиТоваров.ДвижениеРасходВыполнить();

          Регистр.ОстаткиТоваров.Склад = СкладП;

          Регистр.ОстаткиТоваров.Товар = Товар;

          Регистр.ОстаткиТоваров.Сорт = Сорт;

          Регистр.ОстаткиТоваров.Партия = Парт;

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

          Регистр.ОстаткиТоваров.СуммаП = Окр(ЦенОст*КолО,2,1);

          Регистр.ОстаткиТоваров.СуммаД = Окр(Цена*КолО,2,1);

          Регистр.ОстаткиТоваров.ФлагДвижения = 2;

          Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);

          Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();

          Регистр.ОборотыТоваров.Склад = СкладО;

          Регистр.ОборотыТоваров.Товар = Товар;

          Регистр.ОборотыТоваров.Сорт = Сорт;

          Регистр.ОборотыТоваров.Количество = КолО;

          Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенОст*КолО,2,1);

          Регистр.ОборотыТоваров.ФлагДвижения = 2;

          Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);

          Регистр.ОборотыТоваров.ДвижениеВыполнить();

          Регистр.ОборотыТоваров.Склад = СкладП;

          Регистр.ОборотыТоваров.Товар = Товар;

          Регистр.ОборотыТоваров.Сорт = Сорт;

          Регистр.ОборотыТоваров.Количество = КолО;

          Регистр.ОборотыТоваров.СуммаУ = Окр(ЦенОст*КолО,2,1);

          Регистр.ОборотыТоваров.ФлагДвижения = 2;

          Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);



          Регистр.ОборотыТоваров.ДвижениеВыполнить();

        КонецЦикла;

      КонецЕсли;

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

    Здесь мы переставили алгоритмы списания местами, в расходной накладной при списании по методу FIFO мы использовали алгоритм выгрузки регистра, а LIFO – запрос, то теперь наоборот, с соответствующими изменениями.


  • Внесем дополнения по аналогии с другими накладными в журнал "Накладные";


  • Войдем в окно редактирования документа "ПриходнаяНакладная";


  • [Ввод на основании...];


  • Может являться основанием для документа любого вида – Нет;


  • Сохраним конфигурацию;


  • Войдем в 1С:Предприятие;


  • Сделаем нашу расходную накладную не проведенной;


  • Установим способ списания – FIFO;


  • На основании приходной накладной №7 введем накладную на перемещение. Для этого установим в журнале курсор на нужном документе. Меню Действия команда "Ввести на основании";


  • Создалась уже почти заполненная накладная на перемещение №2 от 08.10.2000;


  • Укажем склад получатель – Склад №2;


  • Проведем накладную;


  • Посмотрим на движения. Хоть мы и указали как основание накладную №7, у нас списалось с более ранней накладной №6. Как написали алгоритм списания – так и получилось. Отсюда мораль: "Программа делает не то, что хочешь, а то, что напишешь!";


  • Глава 9

    2.25 Оборотные ведомости.

    Документом "Накладная на перемещение " мы завершили создание системы учета остатков на складах и товарооборота. Но учет не имеет смысла без отчетности. У нас уже есть отчеты, которые показывают состояние остатков и долгов на конкретную дату. Создадим два отчета: один нам покажет изменение долгов за какой-то период, а второй движение по складу товаров.

  • Создаем новый отчет "ОбороткаПоДолгам";


  • Добавим поле ввода ДатаН – тип Дата, формула ДатаН();


  • Добавим поле ввода ДатаК – тип Дата, формула ДатаК();



  • Пропишем процедуры в модуле формы:

    Процедура ДатаН()

      Если ДатаН>ДатаК Тогда

        ДатаН=ДатаК;

      КонецЕсли;

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



    //-----------------------------------------------

    Процедура ДатаК()

      Если  ДатаК<ДатаН Тогдаbr>     ДатаК=ДатаН;

      ИначеЕсли ДатаК>ПолучитьДатуТА() Тогда

        ДатаК=ПолучитьДатуТА();

      КонецЕсли;

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

    //-----------------------------------------------

    Процедура Сформировать()

      Запрос=СоздатьОбъект("Запрос");

      ТекстЗапроса="

      |Период с ДатаН по ДатаК;

      |Контр = Регистр.Взаиморасчеты.Контрагент;

      |Догов = Регистр.Взаиморасчеты.Договор;

      |Сумма = Регистр.Взаиморасчеты.Сумма;

      |Флаг = Регистр.Взаиморасчеты.ФлагДвижения;

      |Функция СуммаНачОст = НачОст(Сумма);

      |Функция СуммаПриходТов = Приход(Сумма) когда(Флаг=1);

      |Функция СуммаРасходТов = Расход(Сумма) когда(Флаг=2);

      |Функция СуммаРасходДен = Расход(Сумма) когда(Флаг=3);

      |Функция СуммаПриходДен = Приход(Сумма) когда(Флаг=4);

      |Функция СуммаКонОст = КонОст(Сумма);

      |Группировка Контр упорядочить по Контр.Код;

      |Группировка Догов;";

      Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда

        Сообщить("Запрос не выполнен");

        Возврат;

      КонецЕсли;

      Таб=СоздатьОбъект("Таблица");

      Таб.ИсходнаяТаблица("Таблица");

      ИтНачОст=Запрос.СуммаНачОст;

      ИтПрихТов=Запрос.СуммаПриходТов;

      ИтРасхДен=Запрос.СуммаРасходДен;

      ИтРасхТов=Запрос.СуммаРасходТов;

      ИтПрихДен=Запрос.СуммаПриходДен;

      ИтКонОст=Запрос.СуммаКонОст;

    // для итогов перед началом прохода по группировкам получаем

    // значения функций для всей выборки сразу

      Таб.ВывестиСекцию("Шапка");

      Пока Запрос.Группировка(1)=1 Цикл

        Контра=Запрос.Контр;

        НачОст=Запрос.СуммаНачОст;

        ПрихТов=Запрос.СуммаПриходТов;

        РасхДен=Запрос.СуммаРасходДен;

        РасхТов=Запрос.СуммаРасходТов;

        ПрихДен=Запрос.СуммаПриходДен;



        КонОст=Запрос.СуммаКонОст;

        Если Контра.ЭтоГруппа()=1 Тогда

          Таб.ВывестиСекцию("Группа");

        Иначе

          Таб.ВывестиСекцию("Контра");

          Пока Запрос.Группировка(2)=1 Цикл

            Дог=Запрос.Догов;

            НачОст=Запрос.СуммаНачОст;

            ПрихТов=Запрос.СуммаПриходТов;

            РасхДен=Запрос.СуммаРасходДен;

            РасхТов=Запрос.СуммаРасходТов;

            ПрихДен=Запрос.СуммаПриходДен;

            КонОст=Запрос.СуммаКонОст;

            Таб.ВывестиСекцию("Дог");

          КонецЦикла;

        КонецЕсли;

      КонецЦикла;

      Таб.ВывестиСекцию("Итого");

      Таб.ТолькоПросмотр(1);

      Таб.ПараметрыСтраницы(1,100,1);

      Таб.Показать("");

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


  • Создадим шаблон печатной формы;



  • Сохраним конфигурацию;


  • Создаем новый отчет "ОбороткаПоСкладу";


  • Добавим поле ввода ДатаН – тип Дата, формула ДатаН();


  • Добавим поле ввода ДатаК – тип Дата, формула ДатаК();


  • Добавим поле ввода Склад – тип С.Склады;



  • Пропишем процедуры в модуле формы:

    //-----------------------------------------------

    Процедура ДатаН()

      Если ДатаН>ДатаК Тогда

        ДатаН=ДатаК;

      КонецЕсли;

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

    //-----------------------------------------------

    Процедура ДатаК()

      Если  ДатаК<ДатаН Тогдаbr>     ДатаК=ДатаН;

      ИначеЕсли ДатаК>ПолучитьДатуТА() Тогда

        ДатаК=ПолучитьДатуТА();

      КонецЕсли;

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

    //-----------------------------------------------

    Процедура Сформировать()

      Если Склад.Выбран()=0 Тогда

        Сообщить("Не выбран склад");

        Возврат;

      КонецЕсли;

      Запрос=СоздатьОбъект("Запрос");

      ТекстЗапроса="



      |Период с ДатаН по ДатаК;

      |Скл = Регистр.ОстаткиТоваров.Склад;

      |Товар = Регистр.ОстаткиТоваров.Товар;

      |Сорт = Регистр.ОстаткиТоваров.Сорт;

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

      |ФлагДвижения = Регистр.ОстаткиТоваров.ФлагДвижения;

      |Функция КолНачОстС = НачОст(Количество);

      |Функция КолПриходК = Приход(Количество) когда(ФлагДвижения=1);

      |Функция КолПриходВ = Приход(Количество) когда(ФлагДвижения=2);

      |Функция КолРасходВ = Расход(Количество) когда(ФлагДвижения=2);

      |Функция КолРасходК = Расход(Количество) когда(ФлагДвижения=1);

      |Функция КолКонОстС = КонОст(Количество);

      | Группировка Товар упорядочить по Товар.Код;

      |Группировка Сорт;

      |Условие(Скл=Склад);";

      Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда

        Сообщить("Запрос не выполнен");

        Возврат;

      КонецЕсли;

      Таб=СоздатьОбъект("Таблица");

      Таб.ИсходнаяТаблица("");

      Таб.ВывестиСекцию("Шапка");

      ИтНачОстС = Запрос.КолНачОстС;

      ИтПриходК = Запрос.КолПриходК;

      ИтПриходВ = Запрос.КолПриходВ;

      ИтРасходВ = Запрос.КолРасходВ;

      ИтРасходК = Запрос.КолРасходК;

      ИтКонОстС = Запрос.КолКонОстС;

      Пока Запрос.Группировка("Товар")=1 Цикл

        ТТов=Запрос.Товар;

        НачОстС = Запрос.КолНачОстС;

        ПриходК = Запрос.КолПриходК;

        ПриходВ = Запрос.КолПриходВ;

        РасходВ = Запрос.КолРасходВ;

        РасходК = Запрос.КолРасходК;

        КонОстС = Запрос.КолКонОстС;

        Если ТТов.ЭтоГруппа()=1 Тогда

          Тов=СокрЛП(ТТов.Наименование);

          Таб.ВывестиСекцию("Группа");

        Иначе

          Тов=СокрЛП(ТТов.Код)+" ("+СокрЛП(ТТов.Наименование)+")";

          НачОстС = Запрос.КолНачОстС;



          ПриходК = Запрос.КолПриходК;

          ПриходВ = Запрос.КолПриходВ;

          РасходВ = Запрос.КолРасходВ;

          РасходК = Запрос.КолРасходК;

          КонОстС = Запрос.КолКонОстС;

          Таб.ВывестиСекцию("Товар");

          Пока Запрос.Группировка("Сорт")=1 Цикл

            Срт=Запрос.Сорт;

            НачОстС = Запрос.КолНачОстС;

            ПриходК = Запрос.КолПриходК;

            ПриходВ = Запрос.КолПриходВ;

            РасходВ = Запрос.КолРасходВ;

            РасходК = Запрос.КолРасходК;

            КонОстС = Запрос.КолКонОстС;

            Таб.ВывестиСекцию("Сорт");

          КонецЦикла;

        КонецЕсли;

      КонецЦикла;

      Таб.ВывестиСекцию("Итого");

      Таб.ТолькоПросмотр(1);

      Таб.ПараметрыСтраницы(1,100,1);

      Таб.Показать("");

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

    Во многом модуль этого отчета похож на предыдущий.


  • Создадим шаблон печатной формы;



  • Сохраним изменения в конфигурации;


  • Загрузим 1С:Предприятие;


  • Создадим несколько новых документов, проведем старые и посмотрим, что выдадут нам наши отчеты;


  • 2.26 Отчет по прибыли с товара.

    В регистре "ОстаткиТовара" мы хранили такую информацию, как сумма поступления и сумма реализации. Создадим отчет, показывающий прибыль, которую мы получили в результате нашей хозяйственной деятельности.

  • Создаем новый отчет "Прибыль";


  • Добавим поле ввода ДатаН – тип Дата, формула ДатаН();


  • Добавим поле ввода ДатаК – тип Дата, формула ДатаК();


  • Добавим поле ввода Склад – тип С.Склады;


  • Добавим кнопку [Х]. Пропишем в поле Формула свойств кнопки Склад="", этой кнопкой мы будем очищать поле "Склад";



  • Пропишем процедуры в модуле формы:

    Процедура ДатаН()

      Если ДатаН>ДатаК Тогда



        ДатаН=ДатаК;

      КонецЕсли;

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

    //-----------------------------------------------

    Процедура ДатаК()

      Если  ДатаК<ДатаН Тогдаbr>     ДатаК=ДатаН;

      ИначеЕсли ДатаК>ПолучитьДатуТА() Тогда

        ДатаК=ПолучитьДатуТА();

      КонецЕсли;

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

    //-----------------------------------------------

    Процедура Сформировать()

      Запрос=СоздатьОбъект("Запрос");

      ТекстЗапроса="

      |Период с ДатаН по ДатаК;

      |Скл = Регистр.ОстаткиТоваров.Склад;

      |Товар = Регистр.ОстаткиТоваров.Товар;

      |Сорт = Регистр.ОстаткиТоваров.Сорт;

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

      |СуммаП = Регистр.ОстаткиТоваров.СуммаП;

      |СуммаД = Регистр.ОстаткиТоваров.СуммаД;

      |Ф = Регистр.ОстаткиТоваров.ФлагДвижения;

      |Функция КоличРасходС = Расход(Количество) когда(Ф=1);

      |Функция СуммаПРасход = Расход(СуммаП) когда(Ф=1);

      |Функция СуммаДРасход = Расход(СуммаД) когда(Ф=1);

      |Группировка Товар упорядочить по Товар.Код без групп;

      |Группировка Сорт упорядочить по Сорт.Код;";

    // Мы не хотим в запросе получать группы товара (для примера)

      СклТекст="По всем складам";

      Если Склад.Выбран()=1 Тогда

        СклТекст="По складу: "+СокрЛП(Склад.Наименование);

        ТекстЗапроса=ТекстЗапроса+"

        |Условие(Скл=Склад);";

      КонецЕсли;

      Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда

        Сообщить("Запрос не выполнен");

        Возврат;

      КонецЕсли;

      Таб=СоздатьОбъект("Таблица");

      Таб.ИсходнаяТаблица("");

      ИтКолРасх = Запрос.КоличРасходС;

      ИтСумПРас = Запрос.СуммаПРасход;

      ИтСумДРас = Запрос.СуммаДРасход;

      ИтПрибыль = ИтСумДРас-ИтСумПРас;

      Таб.ВывестиСекцию("Шапка");

      Пока Запрос.Группировка("Товар")=1 Цикл



        ТТов=Запрос.Товар;

        Тов=СокрЛП(ТТов.Код)+" ("+СокрЛП(ТТов.Наименование)+")";

        КолРасх = Запрос.КоличРасходС;

        СумПРас = Запрос.СуммаПРасход;

        СумДРас = Запрос.СуммаДРасход;

        Прибыль = СумДРас-СумПРас;

        Таб.ВывестиСекцию("Товар");

        Пока Запрос.Группировка("Сорт")=1 Цикл

          Срт=Запрос.Сорт;

          КолРасх = Запрос.КоличРасходС;

          СумПРас = Запрос.СуммаПРасход;

          СумДРас = Запрос.СуммаДРасход;

          Прибыль = СумДРас-СумПРас;

          Таб.ВывестиСекцию("Сорт");

        КонецЦикла;

      КонецЦикла;

      Таб.ВывестиСекцию("Итого");

      Таб.ТолькоПросмотр(1);

      Таб.ПараметрыСтраницы(1,100,1);

      Таб.Показать("");

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


  • Создадим шаблон печатной формы;



  • 2. 27 Отчет по обороту товара.

    Сформируем отчет по товарообороту. Для него мы возьмем данные из регистра "ОборотыТоваров".

  • Создаем новый отчет "ТоварооборотПоСкладу";


  • Добавим поле ввода ДатаН – тип Дата, формула ДатаН();


  • Добавим поле ввода ДатаК – тип Дата, формула ДатаК();


  • Добавим поле ввода Склад – тип С.Склады;


  • Добавим кнопку [Х]. Пропишем в поле Формула свойств кнопки Склад="", этой кнопкой мы будем очищать поле "Склад";



  • Пропишем процедуры в модуле формы:

    //-----------------------------------------------

    Процедура ДатаН()

      Если ДатаН>ДатаК Тогда

        ДатаН=ДатаК;

      КонецЕсли;

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

    //-----------------------------------------------

    Процедура ДатаК()

      Если  ДатаК<ДатаН Тогдаbr>     ДатаК=ДатаН;

      ИначеЕсли ДатаК>ПолучитьДатуТА() Тогда

        ДатаК=ПолучитьДатуТА();

      КонецЕсли;

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

    //-----------------------------------------------

    Процедура Сформировать()



      Запрос=СоздатьОбъект("Запрос");

      ТекстЗапроса="

      |Период с ДатаН по ДатаК;

      |Скл = Регистр.ОборотыТоваров.Склад;

      |Тов = Регистр.ОборотыТоваров.Товар;

      |Срт = Регистр.ОборотыТоваров.Сорт;

      |Кол = Регистр.ОборотыТоваров.Количество;

      |Сум = Регистр.ОборотыТоваров.СуммаУ;

      |Функция КолСум = Сумма(Кол);

      |Функция СумСум = Сумма(Сум);

      |Группировка Тов упорядочить по Тов.Код без групп;

      |Группировка Срт упорядочить по Сорт.Код;";

      СклТекст="По всем складам";

      Если Склад.Выбран()=1 Тогда

        СклТекст="По складу: "+СокрЛП(Склад.Наименование);

        ТекстЗапроса=ТекстЗапроса+"

        |Условие(Скл=Склад);";

      КонецЕсли;

      Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда

        Сообщить("Запрос не выполнен");

        Возврат;

      КонецЕсли;

      Таб=СоздатьОбъект("Таблица");

      Таб.ИсходнаяТаблица("");

      ИтКолСум = Запрос.КолСум;

      ИтСумСум = Запрос.СумСум;

      Таб.ВывестиСекцию("Шапка");

      Пока Запрос.Группировка("Товар")=1 Цикл

        ТТов=Запрос.Товар;

        Тов=СокрЛП(ТТов.Код)+" ("+СокрЛП(ТТов.Наименование)+")";

        КолСум = Запрос.КолСум;

        СумСум = Запрос.СумСум;

        Таб.ВывестиСекцию("Товар");

        Пока Запрос.Группировка("Сорт")=1 Цикл

          Срт=Запрос.Сорт;

          КолСум = Запрос.КолСум;

          СумСум = Запрос.СумСум;

          Таб.ВывестиСекцию("Сорт");

        КонецЦикла;

      КонецЦикла;

      Таб.ВывестиСекцию("Итого");

      Таб.ТолькоПросмотр(1);

      Таб.ПараметрыСтраницы(1,100,1);

      Таб.Показать("");

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


  • Создадим шаблон печатной формы;



  • Теперь мы можем загрузить 1С:Предприятие и посмотреть, что нам выдадут наши отчеты;




  • Глава 10

    2.28 Новые наборы прав.

    Мы все это время работали с одним набором прав. Права мы себе присвоили самые неограниченные, но при реальной работе это недопустимо. Разным пользователям, в зависимости от их служебных обязанностей, должен быть разный уровень допуска к данным. Одним можно все, другим - почти все, третьим – только просмотр результатов, а четвертых вообще к машине допускать нельзя. Разговор пойдет о первых трех категориях пользователей.

    Пользователь первой категории у нас уже создан.

    Пользователя второй категории нам предстоит создать. Пусть это будет кладовщик. Он может вводить и проводить накладные и просматривать отчеты по остаткам и оборотам на складе. Снимать с проведения документы он не будет иметь права.

    Список прав кладовщика:

            - Справочник

                - Идентификатор    "Номенклатура"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Единицы"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Склады"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Контрагенты"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Договора"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Сорт"

                - Чтение    Да

                - Остальное    Нет

            - Документ

                - Идентификатор    "ПриходнаяНакладная"

                - Чтение    Да

                - ВводНового    Да

                - ПометкаНаУдаление    Да

                - Корректировка    Да

                - Выбор    Да

                - ПроведениеДокумента    Да

                - Остальное    Нет

            - Документ

                - Идентификатор    "РасходнаяНакладная"

                - Чтение    Да

                - ВводНового    Да

                - ПометкаНаУдаление    Да

                - Корректировка    Да

                - Выбор    Да

                - ПроведениеДокумента    Да

                - Остальное    Нет

            - Документ

                - Чтение    Да

                - ВводНового    Да

                - ПометкаНаУдаление    Да

                - Корректировка    Да

                - Выбор    Да

                - ПроведениеДокумента    Да

                - Остальное    Нет

            - Журнал

                - Идентификатор    "Накладные"

                - Чтение    Да

            - Отчет

                - Идентификатор    "ОстаткиНаСкладе"

                - Использование    Да

            - Отчет

                - Идентификатор    "ОбороткаПоСкладу"

                - Использование    Да

            - Отчет

                - Идентификатор    "ТоварооборотПоСкладу"

                - Использование    Да

    <


  • Переходим к окну с деревом метаданных;


  • Переключаемся на закладку "Права";


  • Создаем новый набор прав "Кладовщик";


  • Меню Действия команда "Редактировать";


  • Появилось окно "Кладовщик – Редактор пользовательских прав" с деревом метаданных;


  • Найдем в этом окне справочник "Номенклатура";


  • Вызовем его свойства;


  • Появилось окно с набором доступов;



  • Поставим галочку у пункта "Чтение", а остальные пункты оставим не помеченными;


  • Аналогично расставим доступы для остальных объектов метаданных;


  • Закроем окно редактирования прав;

    Мы вернулись в окно со списком наборов прав. Давайте теперь определим, что можно такому пользователю как начальник. Сам он заполнять справочники не будет. Документы он тоже формировать не захочет. Начальники любят отчетность. Значит он у нас попадает в третью группу пользователей. Мы ему даем право просмотра любой информации, без возможности ее изменить.


  •         - Константа

                - Идентификатор    "ЕдИзмПоУмолчанию"

                - Чтение    Да

                - Корректировка    Нет

            - Константа

                - Идентификатор    "ПроцентНаценки"

                - Чтение    Да

                - Корректировка    Нет

            - Константа

                - Идентификатор    "СортПоУмолчанию"

                - Чтение    Да

                - Корректировка    Нет

            - Константа

                - Идентификатор    "МетодСписания"

                - Чтение    Да

                - Корректировка    Нет

            - Справочник

                - Идентификатор    "Номенклатура"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Единицы"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Склады"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Контрагенты"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Договора"

                - Чтение    Да

                - Остальное    Нет

            - Справочник

                - Идентификатор    "Сорт"

                - Чтение    Да

                - Остальное    Нет

            - Документ

                - Идентификатор    "ПриходДенег"

                - Чтение    Да

                - Выбор    Да

                - Остальное    Нет

            - Документ

                - Идентификатор    "ВыплатаДенег"

                - Чтение    Да

                - Выбор    Да

                - Остальное    Нет

            - Документ

                - Идентификатор    "ИзменениеЦен"

                - Чтение    Да

                - Выбор    Да

                - Остальное    Нет

            - Документ

                - Идентификатор    "ПриходнаяНакладная"

                - Чтение    Да

                - Выбор    Да

                - Остальное    Нет

            - Документ

                - Идентификатор    "РасходнаяНакладная"

                - Чтение    Да

                - Выбор    Да

                - Остальное    Нет

            - Документ

                - Идентификатор    "НакладнаяНаПеремещение"

                - Чтение    Да

                - Выбор    Да

                - Остальное    Нет

            - Журнал

                - Идентификатор    "ДвижениеДенег"

                - Чтение    Да

            - Журнал

                - Идентификатор    "ИзменениеЦен"

                - Чтение    Да

            - Журнал

                - Идентификатор    "Накладные"

                - Чтение    Да

            - Отчет

                - Идентификатор    "Взаиморасчеты"

                - Использование    Да

            - Отчет

                - Идентификатор    "ОстаткиНаСкладе"

                - Использование    Да

            - Отчет

                - Идентификатор    "ОбороткаПоДолгам"

                - Использование    Да

            - Отчет

                - Идентификатор    "ОбороткаПоСкладу"

                - Использование    Да

            - Отчет

                - Идентификатор    "Прибыль"

                - Использование    Да

            - Отчет

                - Идентификатор    "ТоварооборотПоСкладу"

                - Использование    Да

    <


  • Создаем набор прав "Начальник";


  • Устанавливаем ему его права;


  • 2.29 Новые интерфейсы.

    Раздав права надо позаботиться и о соответствующих интерфейсах. Если пользователю что не положено, он этого и видеть не должен. Сперва создадим интерфейс кладовщика, как более простой.

  • Заходим на закладку "Интерфейсы";


  • Меню Действия команда "Новый интерфейс";


  • Название "Кладовщик". Отключим меню "Операции";


  • Меню Действия команда "Редактировать";


  • Выбираем Редактировать... Меню;


  • Появилось окно "Кладовщик – Редактор меню";


  • Вернемся к окну со списком интерфейсов;


  • Откроем окно с редактированием меню Администратора;


  • Выделим ветку "Справочники" и скопируем ее в буфер;


  • Перейдем к окну Кладовщика и вставим из буфера ветку "Справочники";


  • Поступим также и с остальными ветками меню;


  • А теперь открывая по очереди ветки меню кладовщика удалим лишние пункты;


  • Интерфейс кладовщика готов;

    Разберемся с интерфейсом начальника. Его интерфейс будет очень похож на интерфейс Администратора. Будет только отсутствовать ветка "Документы". Сделаем для шефа подчиненный интерфейс на основе интерфейса Администратора.


  • Входим в окно со списком интерфейсов;


  • Ставим курсор на интерфейс Администратора;


  • Меню Действия команда "Новый подчиненный интерфейс";


  • Название "Начальник". Отключим меню "Операции". И будем использовать его при отключенной авторизации;


  • Откроем новый интерфейс для редактирования;


  • Мы видим список пунктов меню Администратора. Отключим лишние;


  • Теперь остается создать пару пользователей с новыми правами и интерфейсами и посмотреть, как это все выглядит.


  • Бухгалтерия

    Введение


    Содержание раздела