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

       

Дополнение


Товар

Товар

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



Сорт

Сорт товара

С.Сорт

Кол

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

Число 8.2

+

Ед

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

С.Единицы

КолО

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

Число 8.2

+,И

Цена

Цена поставки

Число 7.2

+

Сумма

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

Число 15.2

+,И

Здесь:

+ - неотрицательный;

И – итог по колонке;

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

    Процедура Товар()

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

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

    // Если сорт не выбран (сорт может быть выбран если редактируется

    // существующая строка)

          Сорт=Константа.СортПоУмолчанию;

        КонецЕсли;

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

          Кол=1;

        КонецЕсли;

        СпрЕд=СоздатьОбъект("Справочник.Единицы");

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

        СпрЕд.ИспользоватьВладельца(Товар);

    // указываем, что нам нужны только единицы, принадлежащие




    // выбранному товару

        СпрЕд.ВыбратьЭлементы();

        Пока СпрЕд.ПолучитьЭлемент()=1 Цикл

    // перебираем справочник единиц поэлементно

          Если СпрЕд.Ед=Товар.ЕдИзм Тогда

    // мы нашли единицу соответствующую основной единице товара

            Ед=СпрЕд.ТекущийЭлемент();

    // передаем в реквизит табличной части найденное значение

            Прервать;

    // прерываем обход по циклу. То, что мы искали уже найдено

          КонецЕсли;

        КонецЦикла;

        КолО=Окр(Кол*(Ед.Коэффициент),2,1);

    // пересчитываем количество в количество основных единиц

        Цена=Окр(Товар.ЦенаП.Получить(ДатаДок)*(Сорт.Процент/100),2,1);

    // определяем цену товара с учетом текущего сорта

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

    // вычисляем сумму

      КонецЕсли;

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


  • Теперь нам надо по выбору сорта менять цену и соответственно сумму. В свойствах колонки "Сорт" на закладке "Дополнительно" напишем формулу Сорт();


  • В модуль формы добавляем процедуру:

    Процедура Сорт()

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

        Цена=Окр(Товар.ЦенаП.Получить(ДатаДок)*(Сорт.Процент/100),2,1);

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

      КонецЕсли;

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


  • Теперь нам надо, если изменится значение в колонке "Кол", то менялись бы "КолО" и "Сумма". В свойствах колонки "Кол" на закладке "Дополнительно" напишем формулу Кол();


  • В модуль формы добавляем процедуру:

    Процедура Кол()

      КолО=Окр(Кол*(Ед.Коэффициент),2,1);

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

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


  • Теперь нам надо, если изменим единицу измерения, то пересчитывалось бы "КолО" и "Сумма". В свойствах колонки "Ед" на закладке "Дополнительно" напишем формулу Ед();


  • В модуль формы добавляем процедуру:

    Процедура Ед()

      КолО=Окр(Кол*(Ед.Коэффициент),2,1);

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

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




  • Колонки "КолО" и "Сумма" сделаем недоступными для редактирования;


  • Цена в приходной накладной у нас устанавливается из справочника. Оставим себе возможность изменять цену в приходной накладной;


  • При изменении цены накладной должна пересчитываться сумма. В свойствах колонки "Цена" на закладке "Дополнительно" напишем формулу Цена();


  • В модуль формы добавляем процедуру:

    Процедура Цена()

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

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


  • При изменении поля шапки "Поставщик", поле "Договор" должно очищаться. В свойствах поля "Поставщик" на закладке "Дополнительно" напишем формулу Поставщик();


  • В модуль формы добавляем процедуру:

    Процедура Поставщик()

      Договор=ПолучитьПустоеЗначение("Справочник.Договора");

    // Функция ПолучитьПустоеЗначение() возвращает пустое значение

    // заданного типа

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


  • Добавим в форму документа, ниже табличной части, элемент диалога Текст. В свойствах текста на закладке "Общие" очистим содержимое поля "Заголовок". На закладке "Дополнительно" в поле "Формула" пишем: Итог("КолО"). Функция Итог() вернет итог по указанной колонке таблицы если для реквизита табличной части документа была указана опция "Итог по колонке - да";


  • Добавим в форму документа, рядом с предыдущим полем, еще один элемент диалога Текст. В свойствах текста на закладке "Общие" очистим содержимое поля "Заголовок". На закладке "Дополнительно" в поле "Формула" пишем: Итог("Сумма");


  • Экранная форма почти готова. Давайте добавим в документ печатную форму. В остальные документы мы печатные формы добавлять не будем. Но если появится желание, то никто не запрещает;


  • Добавим в форму документа, правее кнопки [Закрыть], элемент диалога Кнопка;


  • Заголовок ей дадим "Печать". Формула Печать();



  • В модуль формы добавляем процедуру:

    Процедура Печать()

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



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

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

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

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

        НС=НомерСтроки;

    // атрибут НомерСтроки возвращает номер текущей строки

    // табличной части

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

      КонецЦикла;

      ИтогПр=Формат(Итог("Сумма"),"ЧПДС");

    // В переменную ИтогПр мы выведем сумму прописью

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

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

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

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

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


  • Перейдем на закладку "Таблица" формы документа;


  • Создадим шаблон таблицы такого, примерно, вида:



  • Строка 10 – Тип "Выражение", Строки 1, 3-6, 13, 14 – Тип "Шаблон";


  • Перейдем в модуль документа;


  • Напишем процедуру проведения документа:


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

    // Долг за поставленный нам товар возрос

      Регистр.Взаиморасчеты.Контрагент = Поставщик;

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

      Регистр.Взаиморасчеты.Сумма = Итог("Сумма");

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

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

    // по каждой строке

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

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

    // Увеличиваем количество товара на складе

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

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

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

        Регистр.ОстаткиТоваров.Партия = ТекущийДокумент();

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

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

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

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

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

    // Указав команду ПривязыватьСтроку() мы к каждой записи по движению

    // регистра укажем – какая конкретно строка документа произвела это движение



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

    // Добавляем запись о росте товарооборота

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

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

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

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

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

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

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

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

    // Оборотный регистр осуществляет не приход/расход а движение

      КонецЦикла;

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

    Условия, при которых документ не должен проводиться напишите сами, если хотите.

    В этой процедуре мы совершили движение сразу по трем регистрам.

    По одному - "Взаиморасчеты" – сразу на весь документ суммой, и по двум другим построчно.

    Сколько строк будет в документе, столько и движений по каждому регистру.

  • Перейдем теперь к журналу "Накладные";


  • Добавим графу. Назовем ее "Кол". Для графы выберем значение Документ.ПриходнаяНакладная.КолО. Как мы видим в списке доступных реквизитов из табличной части присутствуют только те, которые помечены итогом по колонке. В журнал в дополнительную графу тоже попадут значения итога по указанной колонке;


  • Добавим еще графу – "Сумма". Документ.ПриходнаяНакладная.Сумма;


  • Создадим форму журнала;


  • Отредактируем размеры и расположение граф;


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


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


  • Заполним сперва новую константу значением – 1 сорт;


  • Создадим приходную накладную №1 от 04.10.2000;


  • Пусть нам фирма "Винни-Пух и все все все" по договору №12 на склад №1 поставит партию товара;


  • Введем товар, к примеру кефир. Мы видим, что значения в остальных колонках заполнились автоматически;


  • Давайте изменим количество на 5. Посмотрим как изменились значения в других колонках;


  • А теперь единицы на ящики;


  • И сорт поставим второй;


  • И вообще, это будет не кефир, а стулья;




  • Введем еще несколько позиций;


  • Нажмем [Печать]. Наша накладная готова к посылке на принтер;


  • Теперь сохраним и проведем эту накладную;


  • Откроем журнал "Накладные";


  • Найдем нашу накладную;


  • Посмотрим какие движения она совершила;


  • Как мы и хотели, накладная двинула три регистра;


  • Сделайте еще несколько накладных от разных поставщиков, по разным договорам на разные склады;


  • Посмотрите, как изменились данные в отчете "Взаиморасчеты";


  • 2.20 Отчет по остаткам на складе.

    Мы ввели кучу приходных накладных. Теперь нам интересно знать, что на каком складе лежит. Сделаем отчет.

  • Отчет "ОстаткиНаСкладе";



  • Вставим в экранную форму два элемента диалога;


  • Первый: поле ввода "ВыбДата" тип Дата;


  • Второй: поле ввода "ВыбСклад" тип С.Склады;


  • Соответственно приставим к ним текстовые поля с надписью, что есть что (вообще это удобно делать через меню Вставить командой "Элемент диалога...", либо аналогичной кнопкой из панели инструментов) ;


  • В модуле пропишем процедуру:

    Процедура ПриОткрытии()

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

    // РабочаяДата – дата, на которую установлена в данный момент 1С.

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


  • Заполним процедуру Сформировать(). Эта процедура вызывается одноименной кнопкой [Сформировать]. Там она прописана в поле "Формула";

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

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

    // создаем динамическую 2-х мерную таблицу

      ТабЗн.НоваяКолонка("Товар","Справочник.Номенклатура");

      ТабЗн.НоваяКолонка("Сорт","Справочник.Сорт");

      ТабЗн.НоваяКолонка("Ост","Число",17,2);

    // указываем какие колонки будет содержать наша динимическая таблица

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

    // создаем в памяти копию регистра остатков

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

    // указываем, что из этого регистра нам, возможно, надо будет получить данные

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



      РассчитатьРегистрыНа(ВыбДата);

    // указываем на какой момент времени надо получить данные из регистров

      РегОст.ВыбратьИтоги();

    // открываем выборку итогов из регистра (на указанный момент времени)

      Пока РегОст.ПолучитьИтог()=1 Цикл

    // получаем очередной итог

        ТСклад=РегОст.Склад;

        Если ТСклад=ВыбСклад Тогда

    // если текущий итог по выбранному складу

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

    // добавляем в динамическую таблицу новую строку

          ТабЗн.Товар=РегОст.Товар;

          ТабЗн.Сорт=РегОст.Сорт;

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

    // заполняем поля д. таблицы

        КонецЕсли;

      КонецЦикла;

      РегОст="";

    // убираем из памяти копию регистра. Она нам больше не нужна

      СтрокаН=0;

      ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");

    // Это мы делаем, чтобы просмотреть содержимое динамической таблицы

    // у нас будут строки с одинаковым товаром и сортом, они возникли из-за

    // наличия измерения "Партия" нам надо их объединить

      ТабЗн.Свернуть("1,2","3");

    // методом Свернуть() мы объединяем строки у которых содержимое

    // в колонках 1 и 2 одинаковое, а колонку 3 мы суммируем

      СтрокаН=0;

      ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");

    // смотрим что получилось. Строки у нас идут вразнобой

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

    // отсортируем их. сперва сортируем по убыванию колонку 1,

    // а внутри нее, тоже по убыванию, колонку "Сорт"

      СтрокаН=0;

      ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");

    // смотрим на результат

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

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

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

      ТТовар="@#$%&";

    // такого товара у нас, надеюсь, не будет

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

    // открываем выборку строк из д. таблицы



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

        Товар=ТабЗн.Товар;

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

        Сорт=ТабЗн.Сорт;

        Ост=ТабЗн.Ост;

        Ед=Строка(Товар.ЕдИзм);

        Если ТТовар<>Товар Тогда

    // если товар из д. таблицы не совпадает с переменной ТТовар

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

    // выводим эту секцию таблицы для печати

          ТТовар=Товар;

        Иначе

    // товар совпадает, только сорт другой

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

    // выводим эту секцию

        КонецЕсли;

      КонецЦикла;

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

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

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

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


  • Теперь создаем шаблон для печатной таблицы;




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


  • Смотрим, что нам покажет отчет на разные даты по разным складам;


  • Глава 8

    2.21 FIFO/LIFO/По-среднему.

    Любителей футбола просим не беспокоится. Речь у нас пойдет не о FIFA, а о способах списания товара при разных системах учета. Бухгалтерам объяснять, что это такое, не нужно. Для остальных кратенько поясним.

    FIFO (First Input First Output) – это такая система, при которой ранее пришедшие партии товара списываются первыми. Цена списания – цена партии товара из которой списывают товар.

    LIFO (Last Input First Output) – а это такая система, при которой последняя пришедшая партия товара списывается в первую очередь. Цена списания – цена партии товара из которой списывают товар.

    По-среднему – здесь вообще партии не нужны. Цена списания – средняя цена остатка партий товара на складе.

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

  • Создаем новый виз перечисления – "МетодСписания";


  • Добавим значения ФИФО, ЛИФО, По_Среднему. В представлении можно и латинскими буквами, а в идентификаторах – русскими, чтобы при наборе кода лишний раз язык не переключать;



    Для хранения выбранного нами типа списания заведем константу;


  • Создаем константу "МетодСписания" тип П.МетодСписания;

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


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


  • Меню Действия команда "Глобальный модуль";


  • Появилось окно глобального модуля. Подробнее в "Описание встроенного языка" т. 1;


  • Пишем процедуру:

    Процедура ПриНачалеРаботыСистемы()

    // предопределенная процедура, запускается при начале работы

    // в 1С:Предприятии

      Перем Значение;

    // Объявляем переменную

      Если Константа.МетодСписания.Выбран()=0 Тогда

    // если константа не заполнена

        Рез=ВвестиЗначение(Значение,"Выберите способ списания","Перечисление.МетодСписания");

    // просим выбрать способ списания. Рез=1, если выбор произведен,

    // 0 – если нет

        Если Рез=1 Тогда

          Константа.МетодСписания=Значение;

    // установим константе выбранное значение

        Иначе

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

    // Мы просили выбрать значение, а Вы этого не сделали.

    // С 1С работать не будете!

    // СтатусВозврата определяет, как должно завершиться событие вызвавшее

    // предопределенную процедуру. В данном случае открытие системы должно

    // завершиться неудачей. Т.е. 1С:Предприятие закроется.

        КонецЕсли;

      КонецЕсли;

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


  • Загрузим 1С:Предприятие и попробуем сперва отказаться от выбора, а потом выбрать FIFO. Посмотрим значения констант;


  • Создадим две приходные накладные на Склад №3 с одинаковым товаром и сортом и количеством, но с разной ценой прихода. Пусть это будет кефир первого сорта по 20 штук в накладной №6 по цене 6.00 а в накладной №7 по 7.00, яблоки первого сорта по 50 штук в накладной №6 по цене 17.00 а в накладной №7 по 19.00 и яблоки второго сорта по 50 штук в накладной №6 по цене 16.00 а в накладной №7 по 16.40. Накладная №6 должна быть от 06.10.2000, а №7 от 07.10.2000;




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


  • Все остальные накладные надо распровести. Они нам будут только мешать и излишне усложнять картину. Для этого;


  • Откроем журнал "Накладные";


  • Установим курсор на ненужную нам накладную;


  • Меню Действия команда "Сделать документ не проведенным";


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


  • Галочка с пиктограммы документа исчезла – документ не проведен;


  • Проверим по отчету остатки на складе №3;


  • 2.22 Расходная накладная.

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

  • В дереве метаданных в разделе Документы найдем подраздел Нумераторы;


  • Создадим новый нумератор "Накладные";


  • Периодичность – в пределах года, длина – 5, цифровой, контроль уникальности – да;


  • Расходная накладная будет располагаться в уже существующем журнале "Накладные". Данные по документу расходная накладная сведем в таблицу:

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

    Журнал: Накладные

    Нумератор: Накладные     Периодичность:

    Длина:        Тип:

    Уникальность:       Автонумерация: да

    Оперативный учет: да

    Может являться основанием для документа любого вида?:


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