Дополнение
Здесь:
+ - неотрицательный;
И – итог по колонке;
Процедура Товар()
Если Товар.Выбран()=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);
Таб.Показать("");
КонецПроцедуры
Процедура ОбработкаПроведения()
// Долг за поставленный нам товар возрос
Регистр.Взаиморасчеты.Контрагент = Поставщик;
Регистр.Взаиморасчеты.Договор = Договор;
Регистр.Взаиморасчеты.Сумма = Итог("Сумма");
Регистр.Взаиморасчеты.ФлагДвижения = 1;
Регистр.Взаиморасчеты.ДвижениеПриходВыполнить();
// по каждой строке
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
// Увеличиваем количество товара на складе
Регистр.ОстаткиТоваров.Склад = Склад;
Регистр.ОстаткиТоваров.Товар = Товар;
Регистр.ОстаткиТоваров.Сорт = Сорт;
Регистр.ОстаткиТоваров.Партия = ТекущийДокумент();
Регистр.ОстаткиТоваров.Количество = КолО;
Регистр.ОстаткиТоваров.СуммаП = Сумма;
Регистр.ОстаткиТоваров.СуммаД = Сумма;
Регистр.ОстаткиТоваров.ФлагДвижения = 1;
Регистр.ОстаткиТоваров.ПривязыватьСтроку(НомерСтроки);
// Указав команду ПривязыватьСтроку() мы к каждой записи по движению
// регистра укажем – какая конкретно строка документа произвела это движение
Регистр.ОстаткиТоваров.ДвижениеПриходВыполнить();
// Добавляем запись о росте товарооборота
Регистр.ОборотыТоваров.Склад = Склад;
Регистр.ОборотыТоваров.Товар = Товар;
Регистр.ОборотыТоваров.Сорт = Сорт;
Регистр.ОборотыТоваров.Количество = КолО;
Регистр.ОборотыТоваров.СуммаУ = Сумма;
Регистр.ОборотыТоваров.ФлагДвижения = 1;
Регистр.ОборотыТоваров.ПривязыватьСтроку(НомерСтроки);
Регистр.ОборотыТоваров.ДвижениеВыполнить();
// Оборотный регистр осуществляет не приход/расход а движение
КонецЦикла;
КонецПроцедуры
Условия, при которых документ не должен проводиться напишите сами, если хотите.
В этой процедуре мы совершили движение сразу по трем регистрам.
По одному - "Взаиморасчеты" – сразу на весь документ суммой, и по двум другим построчно.
Сколько строк будет в документе, столько и движений по каждому регистру.
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);
Таб.Показать("");
КонецПроцедуры
Глава 8
2.21 FIFO/LIFO/По-среднему.
Любителей футбола просим не беспокоится. Речь у нас пойдет не о FIFA, а о способах списания товара при разных системах учета. Бухгалтерам объяснять, что это такое, не нужно. Для остальных кратенько поясним.
FIFO (First Input First Output) – это такая система, при которой ранее пришедшие партии товара списываются первыми. Цена списания – цена партии товара из которой списывают товар.
LIFO (Last Input First Output) – а это такая система, при которой последняя пришедшая партия товара списывается в первую очередь. Цена списания – цена партии товара из которой списывают товар.
По-среднему – здесь вообще партии не нужны. Цена списания – средняя цена остатка партий товара на складе.
Мы должны при начале работы указать, какой системой списания мы будем в дальнейшем пользоваться. Перечень возможных систем учета мы будем держать в перечислении.
Для хранения выбранного нами типа списания заведем константу;
При начале работы с программой учета надо обязательно выставлять способ списания. И в последующем не менять его. Пусть программа при начале работы проверит, выбран ли способ списания, если не выбран, то предложить выбрать, а если выбран – ничего не делать. Запрещать редактирование мы не будем, нам охота поэкспериментировать.
Процедура ПриНачалеРаботыСистемы()
// предопределенная процедура, запускается при начале работы
// в 1С:Предприятии
Перем Значение;
// Объявляем переменную
Если Константа.МетодСписания.Выбран()=0 Тогда
// если константа не заполнена
Рез=ВвестиЗначение(Значение,"Выберите способ списания","Перечисление.МетодСписания");
// просим выбрать способ списания. Рез=1, если выбор произведен,
// 0 – если нет
Если Рез=1 Тогда
Константа.МетодСписания=Значение;
// установим константе выбранное значение
Иначе
СтатусВозврата(0);
// Мы просили выбрать значение, а Вы этого не сделали.
// С 1С работать не будете!
// СтатусВозврата определяет, как должно завершиться событие вызвавшее
// предопределенную процедуру. В данном случае открытие системы должно
// завершиться неудачей. Т.е. 1С:Предприятие закроется.
КонецЕсли;
КонецЕсли;
КонецПроцедуры
2.22 Расходная накладная.
У нас на одном из складов есть некоторое количество товара. Пришло время создать расходную накладную. Во многом она у нас будет повторять приходную. Похожий набор полей шапки, только вместо поля "Поставщик" мы введем поле "Покупатель". Номер документа у нас будет зависеть не от бухгалтерии контрагента, а от нашей. Нам еще надо учесть, что будет позднее создана накладная на перемещение, и у расходных накладных и у накладных на перемещение должна быть общая нумерация. Это решается введением Нумератора.
Расходная накладная будет располагаться в уже существующем журнале "Накладные". Данные по документу расходная накладная сведем в таблицу:
Идентификатор: РасходнаяНакладная Журнал: Накладные Нумератор: Накладные Периодичность: Длина: Тип: Уникальность: Автонумерация: да Оперативный учет: да Может являться основанием для документа любого вида?: |