`

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

2.12 Хранение данных по взаиморасчетам с контрагентами

Вернемся к нашим контрагентам. С ними мы будем вести разные торговые операции, и, соответственно, будем платить поставщикам за отгруженный товар, а от покупателей получать деньги за проданный. Для ввода данных по хозяйственным операциям в 1С служит такой объект метаданных как "Документ". Документами мы сможем вводить данные по приходу/перемещению/отгрузу товара, приходу/расходу денег, но хранить текущее состояние остатков на складе и состояние взаимозадолженности с контрагентами в документах нельзя. Можно эту информацию хранить в справочнике, если добавить соответствующие поля, но это крайне неэффективно и не удобно. Для такой цели в 1С есть специальный механизм. Этот механизм использует объект метаданных "Регистр" – в оперативном учете (для Бухгалтерии – "ПланСчетов", для Расчета – "Журнал расчетов"). Мы занимаемся изучением компоненты "Оперативный учет" и поэтому будем пользоваться именно "Регистрами".

Как устроен регистр. При его создании фирма 1С использовала некоторые положения технологии OLAP. Вот, к примеру, ссылка с неплохим объяснением, что это такое (http://www.permonline.ru/~enter/june/olap.htm). Там много текста, картинок и все вполне доходчиво. Есть и другие подобные материалы. Описание регистра 1С хорошо посмотреть в КиА том 1.

Регистры бывают двух типов. Регистр остатков и регистр оборотов. Их суть и различия можно проиллюстрировать следующим примером. Представим себе прямую направляющую по которой движется бегунок. На бегунок установлен спидометр с указателем пройденного пути. Мы измеряем расстояние от конца направляющей до бегунка. Бегунок идет вперед – это расстояние растет, идет назад – уменьшается. Так действует регистр остатков. Он показывает текущее состояние координаты бегунка по отношению к какому-то нулевому значению. Аналог – остатки на складе. Они растут, если был приход товара, и уменьшаются, если был расход. У нас есть еще спидометр со счетчиком пройденного пути. В какую бы сторону бегунок не двигался – цифра на счетчике растет. Так действует регистр оборотов. Аналог – величина товарооборота в магазине. Есть ли приход, или расход – товарооборот растет.

Сконструируем сперва регистр взаиморасчетов. У него будет только два измерения: "Контрагент" и "Договор" и один ресурс: "Сумма". Регистр у нас будет типа регистр остатков. Если сумма будет меньше нуля – контрагент должен нам, если больше – мы должны контрагенту. Реквизит заведем один "ФлагДвижения" – типа число и будет принимать следующие значения при изменении состояния регистра:
1 – изменение долга за поставленный нам товар;
2 – изменение долга за проданный нами товар;
3 – изменение долга оплатой за поставленный нам товар;
4 – изменение долга оплатой за проданный нами товар;

Идентификатор: Взаиморасчеты
Тип: Остатки
Периодичность: -

Измерения

Идентификатор

Комментарий

Тип значения

Дополнительно

Контрагент

с кем мы ведем дела

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

Д

Договор

по какому договору

С.Договора

Д, И

Ресурсы

Идентификатор

Комментарий

Тип значения

Дополнительно

Сумма

Сумма долга

Число 15.2

Реквизиты

Идентификатор

Комментарий

Тип значения

Дополнительно

ФлагДвижения

тип движения

Число 1.0

+


Здесь:
Д – отбор движений;
И – отбор итогов;
+ - не отрицательный;

Движения по регистру будут следующие:
Приход – приход к нам товара (общей суммой) либо денег;
Расход – отгруз нами товара (общей суммой) либо выплата денег.

Переходим к конструированию регистра.

  1. Создаем новый регистр;
  2. Идентификатор - "Взаиморасчеты", Комментарий – "регистр взаиморасчетов с контрагентами", Измерения, ресурсы, реквизиты – по таблице, Тип регистра – остатки, быстрая обработка движений – по желанию;


2.13 Первый документ. Приход денег.

У нас есть контрагенты и договора с ними, у нас есть место (регистр), где мы можем хранить информацию по взаиморасчетам с ними. Теперь нам нужен документ, который позволит вводить эти взаиморасчеты. Первым нашим документом будет документ "Приход денег".

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

  1. Входим в ветвь "Документы" дерева метаданных;
  2. Устанавливаем курсор на раздел "Общие реквизиты";
  3. Вводим новый общий реквизит;
  4. Идентификатор – "Комментарий", тип – Строка, длина – 100;

  5. Обговорим теперь структуру нашего документа "Приход денег". Кроме полей с датой, номером и комментарием нам, разумеется, понадобится указание – кто нам эти деньги платит? – "Контрагент", на каком основании он платит нам эти деньги? – "Договор", сколько денег он нам платит? – "Сумма". Типы полей "Контрагент" и "Договор" - соответствующие справочники. Поле "Сумма" будет у нас Число 9.2. Создадим этот документ.
  6. Вводим новый документ;
  7. Идентификатор – "ПриходДенег", Синоним – "Приход денег", Комментарий – "приход денег от контрагента";
  8. Документ будет проводиться – да, при записи документ будет перепроводиться – да;

  9. Здесь необходимо дать пояснение, что такое проведение документа. Проведение документа – это внесение соответствующих изменений в механизмы хранения данных (в регистры, планы счетов, журналы расчетов). Документ, у которого стоит указание на возможность проведения, может находиться в трех состояниях – не существует (наиболее частое), записан – данные сохранены, проведен – данные сохранены и учтены в механизме хранения данных (если этот механизм не указан, документ все равно считается проведенным) – т. е. совершил какое-то движение в учете.
  10. Документ будет принадлежать журналу – да, Создать новый журнал – "ДвижениеДенег";

  11. Журнал – список документов определенного/определенных видов. Имеет экранную форму.
  12. И документ и журнал вставим в экранное меню;
  13. Открылось окно свойств документа;
  14. В перечень реквизитов шапки занесем наши реквизиты – "Контрагент", "Договор", "Сумма". Табличной (многострочной) части в этом документе нет;
  15. Нумератор – не назначен, Периодичность – год;

  16. Периодичность – это как часто будет появляться документ с номером 1.
  17. Автоматическая нумерация строк – нет (у нас строк не будет);
  18. Оперативный учет – ДА;

  19. Этим мы покажем, что движение осуществляется по регистрам.
  20. Создадим форму документа;
  21. Вставим поле с текстом, где мы укажем название документа;
  22. Расставим элементы экранной формы документа поудобнее;
  23. В свойствах поля договор на закладке "Дополнительно" в поле "связан с" пишем "Контрагент";


  24. Справочник "Договора" у нас подчиненный, и мы в форме документа указываем, что договора мы будем брать, принадлежащие ранее указанному контрагенту.
  25. Мы желаем, чтобы при выборе другого контрагента, поле договор очищалось;
  26. В свойствах поля ввода "Контрагент" на закладке "Дополнительно" пишем формулу Контрагент();
  27. В модуле формы пишем следующую процедуру:

  28. Перем СтКонтрагент;
    // Это мы добавили переменную, область действия которой
    // весь модуль формы документа
    //-----------------------------------------------
    Процедура ПриОткрытии()
    // Это предопределенная процедура, запускается при возникновении
    // события – открытие формы документа
    // Она сформировалась автоматически, как мы указали в визарде создания
    // документов
      ПриЗаписиПерепроводить(1);
    // Это означает, что если мы проведенный документ изменили, то при
    // попытке его сохранения программа попытается его перепровести
      СтКонтрагент=Контрагент;
    // Инициализируем переменную СтКонтрагент значением реквизита Контрагент
    КонецПроцедуры
    //-----------------------------------------------
    Процедура Контрагент()
      Если Контрагент<>СтКонтрагент Тогда
    // В поле Контрагент содержимое изменилось
        Договор="";
    // Очищаем поле Договор
        СтКонтрагент=Контрагент;
    // Инициализируем переменную СтКонтрагент новым значением
    // реквизита Контрагент
      КонецЕсли;
    КонецПроцедуры
  29. Закроем форму;
  30. Откроем Модуль документа;
  31. Мы видим текст:

  32. // ********************
    Процедура
    ОбработкаПроведения()
    //Здесь следует написать алгоритм проведения документа
    КонецПроцедуры
    Модуль документа служит для задания правил внесения изменений в механизмы хранения данных.
  33. Перепишем процедуру ОбработкаПроведения:

  34. Процедура ОбработкаПроведения()
    // Предопределенная процедура, запускающая механизмы регистрации движений
      Если Контрагент.Выбран()=0 Тогда
    // Выбран() – метод, возвращающий состояние поля ввода = 1, если поле
    // заполнено и 0 если нет
        Предупреждение("Контрагент не выбран");
    // Вызовем на экран информационное окно с сообщением
        НеПроводитьДокумент();
    // Указываем, что документ заполнен неправильно – он не должен быть проведен
      КонецЕсли;
      Если Договор.Выбран()=0 Тогда
        Предупреждение("Договор не выбран");
        НеПроводитьДокумент();
      КонецЕсли;
      Если Договор.ДатаДоговора>ДатаДок Тогда
    // Договор еще не был заключен на дату документа
        Предупреждение("Неверная дата договора");
        НеПроводитьДокумент();
      КонецЕсли;
    // Теперь будем заполнять поля регистра "Взаиморасчеты"
      Регистр.Взаиморасчеты.Контрагент = Контрагент;
      Регистр.Взаиморасчеты.Договор = Договор;
      Регистр.Взаиморасчеты.Сумма = Сумма;
    // Движение – поступление денег за продаваемый нами товар
    // ФлагДвижения = 4
      Регистр.Взаиморасчеты.ФлагДвижения = 4;
    // Наш долг возрос, либо долг контрагента уменьшился – на регистр
    // пишем сумму приходом
      Регистр.Взаиморасчеты.ДвижениеПриходВыполнить();
    КонецПроцедуры
  35. Закрываем модуль документа;
  36. Закроем окно свойств документа;
  37. Переходим к редактированию журнала. Находим журнал "ДвижениеДенег";
  38. Входим в редактирование журнала;
  39. Добавим новую графу;
  40. Идентификатор – "Сумма";
  41. В возможных значениях отметим Документ.ПриходДенег.Шапка.Сумма;
  42. В выбранных значениях появилось указание на поле документа "Приход денег" "Сумма";
  43. Входим в форму списка журнала;
  44. Разместим графы журнала как будет удобнее, и поменяем им ширину, чтобы все было видно;
  45. Закроем форму списка журнала и окно свойств журнала;
  46. Сохраним конфигурацию;


2.14 Работа с документом.

Документ готов. Проверим его в работе.

  1. Открываем 1С:Предприятие в монопольном режиме;
  2. Через меню "Операции" команда "Управление оперативными итогами";
  3. Ставим дату актуальности итогов на 01.10.2000;
  4. Нажимаем [Установить];
  5. Появился вопрос "Изменить Точку Актуальности итогов";
  6. Отвечаем [Да];
  7. Нам сообщают, что изменение точки актуальности завершено. Подтверждаем получение сообщения (подробнее см. "Руководство пользователя");
  8. Выходим из окна управления итогами;
  9. Из нового раздела меню "Документы" вызываем документ приход денег;
  10. Номер документа – 1, Дата – 02.10.2000, Комментарий – "наш первый документ", Контрагент – "Винни-Пух и все все все", Договор – "№12 от 2 Октября 2000 г.", Сумма – 1000;
  11. [Закрыть];
  12. Нас спросят – сохранить ли документ? [Да];
  13. Попросят указать время – в начало дня;
  14. Входим в меню "Журналы". Выберем журнал "ДвижениеДенег";
  15. Если мы в журнале ничего не видим, значит, у нас стоит не тот период просмотра журнала. Входим в меню Действия, команда "Интервал". Устанавливаем диапазон дат от 01.10.2000 до текущей даты;
  16. Мы видим наш документ. Пиктограммка слева – голубенький листок бумажки. Это значит, что документ сохранен;
  17. Откроем этот документ, дважды щелкнув его мышкой;
  18. Теперь нажмем [ОК];
  19. Нас спросят про сохранение документа – [Да];
  20. Провести документ? – [Да];
  21. Точка актуальности будет перенесена на новую дату. Продолжить? – [Да];

  22. Нами точка Актуальности была выставлена на 01.10.2000, а документ от 02.10.2000 – точка актуальности перемещается на последний проведенный документ.
  23. В журнале пиктограммка приобрела красную галочку – флаг проведения документа, и красную черточку внизу – признак того, что ТА (Точка Актуальности стоит на текущем документе);
  24. Посмотрим, какие движения произвел наш документ;
  25. Курсор на документ. Меню "Действия", команда "Движения документа". Появилось окошко. В нем галочка стоит на строке с надписью Взаиморасчеты – это означает, что движение было только по этому регистру;

  26. Тут есть еще строчка – Реквизиты справочников. Документ при проведении может менять значения периодических реквизитов справочников! (Если, конечно, это прописать в процедуре ОбработкаПроведения).
  27. Выбираем эту строку;
  28. Появилось окно "Движения регистров Взаиморасчеты (Приход денег 1 (02.10.2000))";
  29. Видим в списке движений одну строку со знаком плюс (+) – это был приход. Движение было только одно – как мы и написали;
  30. Закроем 1С:Предприятие;


2.15 Отчет по долгам.

Мы теперь, по данным нашей программы, должны фирме "Винни-Пух и все все все" – 1000 ед. денег. Это мы можем определить из нашего единственного документа, но когда таких документов будет много, и контрагентов в документах будет тоже много, мы запутаемся. Пусть лучше машина сама показывает нам кто, кому, по какому договору и сколько должен. Для таких целей существуют отчеты. Простейший отчет – "список номенклатуры" – мы уже создавали. Этот отчет у нас был включен в форму списка справочника. Теперь мы создадим отчет, имеющий свою отдельную форму.

  1. В дереве метаданных, в разделе отчеты, создаем новый отчет;
  2. Идентификатор – "Взаиморасчеты";
  3. А вот вставлять в интерфейс из визарда не будем. Мы потом сами ручками вставим;
  4. Конструкторы никакие вызывать не будем – так напишем (либо скопируем с сей методички);
  5. Появилась экранная форма отчета;
  6. Добавим поле ввода. Идентификатор – ВыбДата, тип – дата;
  7. В модуле формы пишем:

  8. Процедура Сформировать()
      Запрос=СоздатьОбъект("Запрос");
    // Запрос – специальный объект в 1С, служит для получения структурированной
    // выборки данных
      ТЗ="
      |Период с ВыбДата по ВыбДата;
      |Контр = Регистр.Взаиморасчеты.Контрагент;
      |Дог = Регистр.Взаиморасчеты.Договор;
      |Сум = Регистр.Взаиморасчеты.Сумма;
      |Функция СумКонОст = КонОст(Сум);
      |Группировка Контр упорядочить по Контр.Код;
      |";
    // Это текст запроса. Подробности в "Описании языка" том 2
      Если Запрос.Выполнить(ТЗ)=0 Тогда
        Сообщить("Запрос не выполнен");
        Возврат;
      КонецЕсли;
    // Если запрос будет не выполнен по какой либо причине, метод Выполнить()
    // вернет 0. Мы сообщим пользователю о произошедшей ошибке, и
    // командой Возврат – прервем выполнение процедуры
      ИтогоМы=0;
      ИтогоНам=0;
    // В этих двух переменных мы будем хранить итоговую информацию по долгу
      Таб=СоздатьОбъект("Таблица");
      Таб.ИсходнаяТаблица("");
      Таб.ВывестиСекцию("Шапка");
      Пока Запрос.Группировка("Контр")=1 Цикл
    // Получаем очередную запись из запроса
        ТЭ=Запрос.Контр;
    // Во временную переменную передаем значение выборки
        Долг=Запрос.СумКонОст;
    // Определяем суммарный долг по текущему значению выборки
    // Дальше уже все знакомые нам методы
        Если ТЭ.ЭтоГруппа()=1 Тогда
          НазГр=СокрЛП(ТЭ.Наименование);
          Если  Долг=0 Тогда
          ИначеЕсли Долг>0 Тогда
            Мы=Долг;
            Нам=0;
          ИначеЕсли Долг<0 Тогда
            Мы=0;
            Нам=-Долг;
          КонецЕсли;
          Таб.ВывестиСекцию("Группа");
        Иначе
          Наз="("+СокрЛП(Строка(ТЭ.Код))+") "+СокрЛП(ТЭ.Наименование);
          Если  Долг=0 Тогда
            Продолжить;
          ИначеЕсли Долг>0 Тогда
            Мы=Долг;
            Нам=0;
            ИтогоМы=ИтогоМы+Мы;
          ИначеЕсли Долг<0 Тогда
            Мы=0;
            Нам=-Долг;
            ИтогоНам=ИтогоНам+Нам;
          КонецЕсли;
          Таб.ВывестиСекцию("Строка");
        КонецЕсли;
      КонецЦикла;
      Таб.ВывестиСекцию("Итого");
      Таб.ТолькоПросмотр(1);
      Таб.ПараметрыСтраницы(1,100,1);
      Таб.Показать("");
    КонецПроцедуры
  9. Перейдем на закладку таблица, создадим шаблон, такого вида:


  10. Закроем форму отчета;
  11. Теперь будем включать наш отчет в меню. В окне метаданных перейдем на закладку "Интерфейсы";
  12. Меню Действия, команда "Редактировать". Редактировать меню;
  13. Входим в редактирование строки "новая колонка...";


  14. Название пишем "Отчеты";
  15. [ОК];
  16. Открываем появившийся раздел меню "Отчеты";
  17. Открываем подраздел меню "новый...";

  18. Выбираем объект – Отчеты.Взаиморасчеты;
  19. Поля Название, Подсказка заполнились автоматически. Их можно поменять;
  20. [ОК];
  21. Меню Действия команда "Тест" вызовет окошко, где будет показано, как будет выглядеть наше меню;
  22. Закрываем тестовое окно;
  23. Закрываем окно редактирования меню;
  24. Возвращаемся к дереву метаданных;
  25. Сохраняем конфигурацию;
  26. Входим в 1С:Предприятие;
  27. Через меню Отчеты вызываем наш отчет "Взаиморасчеты";
  28. Устанавливаем дату 02.10.2000;
  29. Нажимаем [Сформировать];
  30. Результат. Мы должны всем поставщикам 1000, из них Винни-Пуху 1000, а всего наш долг 1000. Что и требовалось;

2.16 Документ "Выплата денег".

Документ "Выплата денег" будет практически аналогичен документу "Приход денег". Поэтому мы его создадим простым копированием. И потом внесем в него ряд небольших изменений.

  1. В дереве метаданных скопируем документ "ПриходДенег" в буфер обмена Windows;
  2. Вставим из буфера обмена в раздел "Документы" копию;
  3. Изменим Идентификатор на "ВыплатаДенег", аналогично изменим Синоним и комментарий;
  4. Внесем соответствующие косметические изменения в форму документа;
  5. В модуле проведения документа вместо строки:

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

  8.  Регистр.Взаиморасчеты.ФлагДвижения = 4;
    напишем
     Регистр.Взаиморасчеты.ФлагДвижения = 3;
  9. В журнале "ДвижениеДенег" изменим реквизит "Сумма";
  10. В выбранные значения добавим реквизит "Сумма" из нового документа;
  11. Перейдем на закладку "Интерфейсы" и добавим в меню в раздел "Документы" наш документ "ВыплатаДенег";
  12. Команду укажем – Документы.ВыплатаДенег.Ввести;
  13. Закроем лишние окна;
  14. Сохраним конфигурацию;
  15. Откроем 1С:Предприятие;
  16. Создадим новый документ типа "Выплата денег". Заполним его. Сохраним. Проведем. И полюбуемся на движения которые сформировал документ и результат, который выдаст нам отчет;

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