1С:Предприятие / Простой склад / Глава 7

2.19 Приходная накладная.

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

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

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

Является основанием для

Вводится на основании

Шапка

Реквизит

Описание

ТипЗначения

Доп.

Поставщик

От кого пришел товар

С.Контрагенты

 

Договор

Основание отгрузки товара

С.Договора

 

Склад

Куда пришел товар

С.Склады

 

Таблица

Реквизит

Описание

ТипЗначения

Доп.

Товар

Товар

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

 

Сорт

Сорт товара

С.Сорт

 

Кол

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

Число 8.2

+

Ед

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

С.Единицы

 

КолО

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

Число 8.2

+,И

Цена

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

Число 7.2

+

Сумма

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

Число 15.2

+,И

Здесь:
+ - неотрицательный;
И – итог по колонке;

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

  9. Процедура Товар()
      Если Товар.Выбран()=1 Тогда
        Если Сорт.Выбран()=0 Тогда
    // Если сорт не выбран (сорт может быть выбран если редактируется
    // существующая строка)
          Сорт=Константа.СортПоУмолчанию;
        КонецЕсли;
        Если Кол=0 Тогда
          Кол=1;
        КонецЕсли;
        СпрЕд=СоздатьОбъект("Справочник.Единицы");
    // создаем в памяти копию справочника единиц
        СпрЕд.ИспользоватьВладельца(Товар);
    // указываем, что нам нужны только единицы, принадлежащие
    // выбранному товару
        СпрЕд.ВыбратьЭлементы();
        Пока СпрЕд.ПолучитьЭлемент()=1 Цикл
    // перебираем справочник единиц поэлементно
          Если СпрЕд.Ед=Товар.ЕдИзм Тогда
    // мы нашли единицу соответствующую основной единице товара
            Ед=СпрЕд.ТекущийЭлемент();
    // передаем в реквизит табличной части найденное значение
            Прервать;
    // прерываем обход по циклу. То, что мы искали уже найдено
          КонецЕсли;
        КонецЦикла;
        КолО=Окр(Кол*(Ед.Коэффициент),2,1);
    // пересчитываем количество в количество основных единиц
        Цена=Окр(Товар.ЦенаП.Получить(ДатаДок)*(Сорт.Процент/100),2,1);
    // определяем цену товара с учетом текущего сорта
        Сумма=Окр(КолО*Цена,2,1);
    // вычисляем сумму
      КонецЕсли;
    КонецПроцедуры
  10. Теперь нам надо по выбору сорта менять цену и соответственно сумму. В свойствах колонки "Сорт" на закладке "Дополнительно" напишем формулу Сорт();
  11. В модуль формы добавляем процедуру:

  12. Процедура Сорт()
      Если Сорт.Выбран()=1 Тогда
        Цена=Окр(Товар.ЦенаП.Получить(ДатаДок)*(Сорт.Процент/100),2,1);
        Сумма=Окр(КолО*Цена,2,1);
      КонецЕсли;
    КонецПроцедуры
  13. Теперь нам надо, если изменится значение в колонке "Кол", то менялись бы "КолО" и "Сумма". В свойствах колонки "Кол" на закладке "Дополнительно" напишем формулу Кол();
  14. В модуль формы добавляем процедуру:

  15. Процедура Кол()
      КолО=Окр(Кол*(Ед.Коэффициент),2,1);
      Сумма=Окр(КолО*Цена,2,1);
    КонецПроцедуры
  16. Теперь нам надо, если изменим единицу измерения, то пересчитывалось бы "КолО" и "Сумма". В свойствах колонки "Ед" на закладке "Дополнительно" напишем формулу Ед();
  17. В модуль формы добавляем процедуру:

  18. Процедура Ед()
      КолО=Окр(Кол*(Ед.Коэффициент),2,1);
      Сумма=Окр(КолО*Цена,2,1);
    КонецПроцедуры
  19. Колонки "КолО" и "Сумма" сделаем недоступными для редактирования;
  20. Цена в приходной накладной у нас устанавливается из справочника. Оставим себе возможность изменять цену в приходной накладной;
  21. При изменении цены накладной должна пересчитываться сумма. В свойствах колонки "Цена" на закладке "Дополнительно" напишем формулу Цена();
  22. В модуль формы добавляем процедуру:

  23. Процедура Цена()
      Сумма=Окр(КолО*Цена,2,1);
    КонецПроцедуры
  24. При изменении поля шапки "Поставщик", поле "Договор" должно очищаться. В свойствах поля "Поставщик" на закладке "Дополнительно" напишем формулу Поставщик();
  25. В модуль формы добавляем процедуру:

  26. Процедура Поставщик()
      Договор=ПолучитьПустоеЗначение("Справочник.Договора");
    // Функция ПолучитьПустоеЗначение() возвращает пустое значение
    // заданного типа
    КонецПроцедуры
  27. Добавим в форму документа, ниже табличной части, элемент диалога Текст. В свойствах текста на закладке "Общие" очистим содержимое поля "Заголовок". На закладке "Дополнительно" в поле "Формула" пишем: Итог("КолО"). Функция Итог() вернет итог по указанной колонке таблицы если для реквизита табличной части документа была указана опция "Итог по колонке - да";
  28. Добавим в форму документа, рядом с предыдущим полем, еще один элемент диалога Текст. В свойствах текста на закладке "Общие" очистим содержимое поля "Заголовок". На закладке "Дополнительно" в поле "Формула" пишем: Итог("Сумма");
  29. Экранная форма почти готова. Давайте добавим в документ печатную форму. В остальные документы мы печатные формы добавлять не будем. Но если появится желание, то никто не запрещает;
  30. Добавим в форму документа, правее кнопки [Закрыть], элемент диалога Кнопка;
  31. Заголовок ей дадим "Печать". Формула Печать();

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

  33. Процедура Печать()
      Таб=СоздатьОбъект("Таблица");
      Таб.ИсходнаяТаблица("Таблица ");
      Таб.ВывестиСекцию("Шапка");
      ВыбратьСтроки();
      Пока ПолучитьСтроку()=1 Цикл
        НС=НомерСтроки;
    // атрибут НомерСтроки возвращает номер текущей строки
    // табличной части
        Таб.ВывестиСекцию("Строка");
      КонецЦикла;
      ИтогПр=Формат(Итог("Сумма"),"ЧПДС");
    // В переменную ИтогПр мы выведем сумму прописью
      Таб.ВывестиСекцию("Подвал");
      Таб.ТолькоПросмотр(1);
      Таб.ПараметрыСтраницы(1,100,1);
      Таб.Показать("");
    КонецПроцедуры
  34. Перейдем на закладку "Таблица" формы документа;
  35. Создадим шаблон таблицы такого, примерно, вида:
  36. Строка 10 – Тип "Выражение", Строки 1, 3-6, 13, 14 – Тип "Шаблон";
  37. Перейдем в модуль документа;
  38. Напишем процедуру проведения документа:

  39. Процедура ОбработкаПроведения()
    // Долг за поставленный нам товар возрос
      Регистр.Взаиморасчеты.Контрагент = Поставщик;
      Регистр.Взаиморасчеты.Договор = Договор;
      Регистр.Взаиморасчеты.Сумма = Итог("Сумма");
      Регистр.Взаиморасчеты.ФлагДвижения = 1;
      Регистр.Взаиморасчеты.ДвижениеПриходВыполнить();
    // по каждой строке
      ВыбратьСтроки();
      Пока ПолучитьСтроку() = 1 Цикл
    // Увеличиваем количество товара на складе
        Регистр.ОстаткиТоваров.Склад = Склад;
        Регистр.ОстаткиТоваров.Товар = Товар;
        Регистр.ОстаткиТоваров.Сорт = Сорт;
        Регистр.ОстаткиТоваров.Партия = ТекущийДокумент();
        Регистр.ОстаткиТоваров.Количество = КолО;
        Регистр.ОстаткиТоваров.СуммаП = Сумма;
        Регистр.ОстаткиТоваров.СуммаД = Сумма;
        Регистр.ОстаткиТоваров.ФлагДвижения = 1;
        Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
    // Указав команду ПривязыватьСтроку() мы к каждой записи по движению
    // регистра укажем – какая конкретно строка документа произвела это движение
        Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();
    // Добавляем запись о росте товарооборота
        Регистр.ОборотыТоваров.Склад = Склад;
        Регистр.ОборотыТоваров.Товар = Товар;
        Регистр.ОборотыТоваров.Сорт = Сорт;
        Регистр.ОборотыТоваров.Количество = КолО;
        Регистр.ОборотыТоваров.СуммаУ = Сумма;
        Регистр.ОборотыТоваров.ФлагДвижения = 1;
        Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
        Регистр.ОборотыТоваров.ДвижениеВыполнить();
    // Оборотный регистр осуществляет не приход/расход а движение
      КонецЦикла;
    КонецПроцедуры


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

  40. Перейдем теперь к журналу "Накладные";
  41. Добавим графу. Назовем ее "Кол". Для графы выберем значение Документ.ПриходнаяНакладная.КолО. Как мы видим в списке доступных реквизитов из табличной части присутствуют только те, которые помечены итогом по колонке. В журнал в дополнительную графу тоже попадут значения итога по указанной колонке;
  42. Добавим еще графу – "Сумма". Документ.ПриходнаяНакладная.Сумма;
  43. Создадим форму журнала;
  44. Отредактируем размеры и расположение граф;
  45. Сохраним конфигурацию;
  46. Загрузим 1С:Предприятие;
  47. Заполним сперва новую константу значением – 1 сорт;
  48. Создадим приходную накладную №1 от 04.10.2000;
  49. Пусть нам фирма "Винни-Пух и все все все" по договору №12 на склад №1 поставит партию товара;
  50. Введем товар, к примеру кефир. Мы видим, что значения в остальных колонках заполнились автоматически;
  51. Давайте изменим количество на 5. Посмотрим как изменились значения в других колонках;
  52. А теперь единицы на ящики;
  53. И сорт поставим второй;
  54. И вообще, это будет не кефир, а стулья;
  55. Введем еще несколько позиций;
  56. Нажмем [Печать]. Наша накладная готова к посылке на принтер;
  57. Теперь сохраним и проведем эту накладную;
  58. Откроем журнал "Накладные";
  59. Найдем нашу накладную;
  60. Посмотрим какие движения она совершила;
  61. Как мы и хотели, накладная двинула три регистра;
  62. Сделайте еще несколько накладных от разных поставщиков, по разным договорам на разные склады;
  63. Посмотрите, как изменились данные в отчете "Взаиморасчеты";

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

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

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

  2. Вставим в экранную форму два элемента диалога;
  3. Первый: поле ввода "ВыбДата" тип Дата;
  4. Второй: поле ввода "ВыбСклад" тип С.Склады;
  5. Соответственно приставим к ним текстовые поля с надписью, что есть что (вообще это удобно делать через меню Вставить командой "Элемент диалога...", либо аналогичной кнопкой из панели инструментов) ;
  6. В модуле пропишем процедуру:

  7. Процедура ПриОткрытии()
      ВыбДата=РабочаяДата();
    // РабочаяДата – дата, на которую установлена в данный момент 1С.
    КонецПроцедуры
  8. Заполним процедуру Сформировать(). Эта процедура вызывается одноименной кнопкой [Сформировать]. Там она прописана в поле "Формула";

  9. Процедура Сформировать()
      ТабЗн=СоздатьОбъект("ТаблицаЗначений");
    // создаем динамическую 2-х мерную таблицу
      ТабЗн.НоваяКолонка("Товар","Справочник.Номенклатура");
      ТабЗн.НоваяКолонка("Сорт","Справочник.Сорт");
      ТабЗн.НоваяКолонка("Ост","Число",17,2);
    // указываем какие колонки будет содержать наша динимическая таблица
      РегОст=СоздатьОбъект("Регистр.ОстаткиТоваров");
    // создаем в памяти копию регистра остатков
      РегОст.ВременныйРасчет(1);
    // указываем, что из этого регистра нам, возможно, надо будет получить данные
    // на момент времени отличный от текущего
      РассчитатьРегистрыНа(ВыбДата);
    // указываем на какой момент времени надо получить данные из регистров
      РегОст.ВыбратьИтоги();
    // открываем выборку итогов из регистра (на указанный момент времени)
      Пока РегОст.ПолучитьИтог()=1 Цикл
    // получаем очередной итог
        ТСклад=РегОст.Склад;
        Если ТСклад=ВыбСклад Тогда
    // если текущий итог по выбранному складу
          ТабЗн.НоваяСтрока();
    // добавляем в динамическую таблицу новую строку
          ТабЗн.Товар=РегОст.Товар;
          ТабЗн.Сорт=РегОст.Сорт;
          ТабЗн.Ост=РегОст.Количество;
    // заполняем поля д. таблицы
        КонецЕсли;
      КонецЦикла;
      РегОст="";
    // убираем из памяти копию регистра. Она нам больше не нужна
      СтрокаН=0;
      ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");
    // Это мы делаем, чтобы просмотреть содержимое динамической таблицы
    // у нас будут строки с одинаковым товаром и сортом, они возникли из-за
    // наличия измерения "Партия" нам надо их объединить
      ТабЗн.Свернуть("1,2","3");
    // методом Свернуть() мы объединяем строки у которых содержимое
    // в колонках 1 и 2 одинаковое, а колонку 3 мы суммируем
      СтрокаН=0;
      ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");
    // смотрим что получилось. Строки у нас идут вразнобой
      ТабЗн.Сортировать("1+,2+");
    // отсортируем их. сперва сортируем по убыванию колонку 1,
    // а внутри нее, тоже по убыванию, колонку "Сорт"
      СтрокаН=0;
      ТабЗн.ВыбратьСтроку(СтрокаН,"Просмотр содержимого таблицы");
    // смотрим на результат
      Таб=СоздатьОбъект("Таблица");
      Таб.ИсходнаяТаблица("Таблица");
      Таб.ВывестиСекцию("Шапка");
      ТТовар="@#$%&";
    // такого товара у нас, надеюсь, не будет
      ТабЗн.ВыбратьСтроки();
    // открываем выборку строк из д. таблицы
      Пока ТабЗн.ПолучитьСтроку()=1 Цикл
        Товар=ТабЗн.Товар;
        Тов=СокрЛП(Товар.Код)+" ("+СокрЛП(Товар.Наименование)+")";
        Сорт=ТабЗн.Сорт;
        Ост=ТабЗн.Ост;
        Ед=Строка(Товар.ЕдИзм);
        Если ТТовар<>Товар Тогда
    // если товар из д. таблицы не совпадает с переменной ТТовар
          Таб.ВывестиСекцию("Товар");
    // выводим эту секцию таблицы для печати
          ТТовар=Товар;
        Иначе
    // товар совпадает, только сорт другой
          Таб.ВывестиСекцию("Сорт");
    // выводим эту секцию
        КонецЕсли;
      КонецЦикла;
      Таб.ТолькоПросмотр(1);
      Таб.ПараметрыСтраницы(1,100,1);
      Таб.Показать("");
    КонецПроцедуры
  10. Теперь создаем шаблон для печатной таблицы;
  11.  

  12. Загружаем 1С:Предприятие;
  13. Смотрим, что нам покажет отчет на разные даты по разным складам;

<< Предыдущая глава | Содержание | Следующая глава >>