1С Режим Конфигуратор. Объекты, свойства и методы

Администрирование базы данных


В меню Администрирование вы найдете следующие пункты:






































Ведение списка пользователей

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

Сохранить данные

Сохранение конфигурации и данных в архив (создание резервных копий). В этом режиме определенные файлы упаковываются в zip-архив. Если вы работаете с SQL-версией, то для сохранения данных применяйте пункт "Выгрузить данные". Нажимайте эту кнопку почаще и ваши данные никогда не пропадут полностью.

Восстановить данные

Восстановить конфигурацию и данные с резервной копии, созданной в предыдущем режиме.

Выгрузить данные

Сохранение конфигурации и данных в архив. В этом режиме вся база данных сохраняется в особый файл "dat", который затем упаковывается в zip-архив.

Загрузить данные

Восстановить конфигурацию и данные с резервной копии, созданной в предыдущем режиме.

Настройка журнала регистрации

Каждое действие пользователя регистрируется в журнал регистрации. Здесь можно настроить фильтр для этого журнала. Сам журнал регистрации можно посмотреть в Мониторе пользователей.

Тестирование и исправление ИБ

Тестирование и исправление информационной базы. Нажимайте эту кнопку почаще для профилактики и для исправления ошибок.

Кодовая страница таблиц ИБ

Установка кодовой страницы файлов DBF.

Распределенная ИБ

Доступно, если у вас установлена компонента "Управление распределенными базами данных (УРБД)".





Архитектура системы


Нормативно-справочная информация используется для ведения базы сотрудников, штатного расписания и при работе с документами. Документы хранятся в журналах документов. Некоторые документы (прием, увольнение, перемещение) при проведении изменяют список сотрудников и количество вакансий в штатном расписании. По каждому сотруднику, кроме основных данных, ведется дополнительная информация в справочниках Кадровые данные, Состав семьи и т.д. Все эти данные используются для формирования отчетности и информационного обслуживания других пользователей и отделов.
Архитектура системы





Атрибуты и методы результата запроса


При обходе группировок результата запроса возможно обращение к следующим атрибутам и методам:








Атрибуты справочников


В качестве обязательных реквизитов каждый справочник имеет Код и Наименование. Код элемента справочника может быть как числовым, так и текстовым. Система 1С:Предприятие предоставляет широкие возможности по работе с кодами элементов справочника: автоматическое присвоение кодов, автоматический контроль уникальности кода и другие.
Помимо кода и наименования, в справочниках системы 1С:Предприятие может храниться любая дополнительная информация об элементе справочника. Для хранения такой информации в справочнике может быть создан список реквизитов. Используя механизм реквизитов справочника, легко организовать, например, картотеку сотрудников. Например, справочник Сотрудники почти наверняка будет иметь атрибуты Должность, Оклад и другие. Фирма 1С предвосхитила программистов и ввела во все справочники два уже заданных атрибута: Код
и Наименование. Действительно, практически любой объект из реальной жизни содержит эти атрибуты. Например, для сотрудников кодом выступает табельный номер, а наименованием -- фамилия, имя, отчество (ФИО).




Бухгалтерские итоги


Работа с основными итогами
При вводе операций 1С:Предприятие поддерживает в актуальном состоянии основные бухгалтерские итоги для быстрого обращения к ним при составлении отчетов и выполнения других задач. Основными итогами называются остатки и обороты по счетам и объектам аналитического учета, а также обороты между счетами за любой рассчитанный период с детализацией до месяца.
Для получения других итогов (с детализацией меньше месяца, с получением оборотов между различными объектами аналитики, а также сложных выборок) требуется выполнение предварительных действий — временного расчета или запроса.
Работа с временными итогами (метод Рассчитать)
Для переключения в режим работы с временными итогами следует выполнить метод Рассчитать. После этого объект позволяет получать остатки и обороты по счетам за произвольный период, заданный при вызове метода Рассчитать.
Работа в режиме запроса (метод ВыполнитьЗапрос)
Для получения большого количества итогов в различных разрезах объект «Бухгалтерские Итоги» переключается в режим работы с запросом. Для переключения в этот режим вызывается метод ВыполнитьЗапрос в параметрах которого, а также дополнительными методами устанавливается состав итогов, которые будут получены запросом. Выполнение данного метода осуществляет выборку данных и их предварительную обработку
Бухгалтерские счета





Бухгалтерские итоги
Перебор счетов

Бухгалтерские итоги
Атрибуты счета

Бухгалтерские итоги
Счета и субсчета

Бухгалтерские итоги
Виды субконто

Бухгалтерские итоги
Список счетов

Бухгалтерские итоги
Другие полезности

Работа с бухгалтерскими счетами очень похожа на работу с иерархическим справочником. Существует список счетов, имеющих стандартные атрибуты (Код, Наименование и др), и дополнительные реквизиты, задаваемые разработчиком. Реквизиты могут быть периодическими, т.е. хранить значение на определенную дату. Счета могут объединяться в группы, тогда счета, входящие в группу, называются субсчетами. Каждый счет обязательно принадлежит определенному плану счетов. В конфигурации может быть произвольное количество планов счетов, один из которых является основным.




Чтение файла DBF


В данном случае, мне кажется, что проще написать программу и прокомментировать ее, чем делать что-то еще. Вы уже такие продвинутые, раз добрались до этой главы! Я горжусь вами!
Файл = создатьОбъект("XBASE"); //создаем ссылку на файл DBF

Файл.ОткрытьФайл("catalog.dbf"); //открываем файл на диске

Файл.КодоваяСтраница(1); //задаем кодировку: 0 - windows, 1 - DOS
Если Файл.Открыта()=0 Тогда //проверяем, удалось ли открыть файл

........Сообщить("Не удалось открыть файл!");

КонецЕсли;
Файл.Первая(); //позиционируемся на первой записи

Пока Файл.ВКонце()=0 Цикл //пока не дошли до конца, крутим цикл

.......НомерЗаписи = Файл.НомерЗаписи(); //получаем номер текущей записи

.......НазвТовара = Файл.NAME; //получаем значение поля

.......Цена = Файл.ПолучитьЗначениеПоля("PRICE"); //так тоже можно, но чуть медленнее

.......Файл.Следующая(); //переходим на следующую запись

КонецЦикла;
Файл.Последняя(); //позиционируемся на первой записи

Пока Файл.ВНачале()=0 Цикл //пока не дошли до начала, крутим цикл

.......НазвТовара = Файл.NAME;

.......Цена = Файл.PRICE;

.......Файл. Предыдущая(); //переходим на предыдущую запись

КонецЦикла;
Для н = 1 По Файл.КоличествоЗаписей() Цикл //здесь все понятно, по-моему

......Файл.Перейти(н); //позиционируемся на определенной записи

.......НазвТовара = Файл.NAME;

.......Цена = Файл.PRICE;

КонецЦикла;

Файл.ЗакрытьФайл(); //не забывайте пожалуйста




Что можно скачать


Так как работа с метаданными плохо документирована самой фирмой 1С, то рекомендуется скачать следующий файл, который является файлом для Синтакс-помощника. В нем содержится описание работы с некоторыми методами объекта Метаданные.
metadata_als.zip
Распакуйте и поместите als-файл в каталог Program Files\1cv77\BIN и он будет подключен к Синтакс-помощнику.




Что такое нумератор?


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




Цикл по реквизитам справочника


кфгСпрСотр = Метаданные.Справочник("Сотрудники");
КолвоРеквизитов = кфгСпрСотр.Реквизит();

Для Ном=1 to КолвоРеквизитов Цикл
кфгРекв = кфгСпрСотр.Реквизит(Ном);

Идентификатор = кфгРекв.Идентификатор();

ПолныйИдентификатор = кфгРекв.ПолныйИдентификатор();

Синоним = кфгРекв.Синоним();

Комментарий = кфгРекв.Комментарий();

Тип = кфгРекв.Тип(); //"Строка", "Число", "Справочник"

Вид = кфгРекв.Вид(); //напр. "Сотрудники"

Длина = кфгРекв.Длина();

Точность = кфгРекв.Точность();

Периодический = кфгРекв.Периодический();

.....<и так далее>
КонецЦикла;
т.е. если вызвать метод Метаданные.Справочник(Х).Реквизит() без параметров, то он вернет общее количество реквизитов справочника Х в конфигурации. Если передать ему в качестве параметра номер или название реквизита, то он вернет реквизит справочника как объект конфигурации.




Цикл по справочникам


КолвоСправочниковВКонфигурации = Метаданные.Справочник();

Для Ном=1 to КолвоСправочниковВКонфигурации Цикл
кфгСпр = Метаданные.Справочник(Ном);

Идентификатор = кфгСпр.Идентификатор();

ПолныйИдентификатор = кфгСпр.ПолныйИдентификатор();

Синоним = кфгСпр.Синоним();

Комментарий = кфгСпр.Комментарий();

КоличествоУроней = кфгСпр.КоличествоУроней();

ПодчиненЛи = кфгСпр.Владелец().Выбран();

Владелец = кфгСпр.Владелец();

ИдентификаторВладельца = кфгСпр.Владелец().Идентификатор;

.....<и так далее>
КонецЦикла;
т.е. если вызвать метод Метаданные.Справочник() без параметров, то он вернет общее количество справочников в конфигурации. Если передать ему в качестве параметра номер или название справочника, то он вернет справочник как объект конфигурации.




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


Дата создания (или записи) - обязательный атрибут любого документа. Через него можно получить или назначить дату, с которой будет записан документ:
Док = СоздатьОбъект("Документ.РасходнаяНакладная");

Док.Новый();

Если Док.ДатаДок = '01.01.02' Тогда

..........Сообщить("С Новым Годом!");

КонецЕсли;




Дерево конфигурации (метаданные)








Дерево конфигурации (метаданные)


В окне конфигурации можно раскрывать списки объектов (константы, справочники, документы и т.д.). Объекты можно добавлять, удалять, редактировать, изменять их порядок, сортировать, писать для них описание.
Дерево конфигурации (метаданные)

Каждый объект имеет свойства и контекстное меню (вызывается правой кнопкой мыши).
Также к конфигурации относятся Интерфейсы и Права. Для их вызова нужно щелкнуть вкладки, расположенные внизу дерева конфигурации.
Кроме того, когда окно дерева конфигурации активно в меню Действия становятся доступными пункты "Глобальный модуль", "Общие таблицы" и "Библиотека картинок".
Дерево конфигурации (метаданные)






Добавление строк в таблицу значений


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

ТабЗнач.Номер = 1;

ТабЗнач.Сотрудник = "Иванов Иван Иванович"; //следите за типом колонки!

ТабЗнач.Должность = "Программист";

ТабЗнач.Оклад = 20000;
ТабЗнач.НоваяСтрока();

ТабЗнач.Номер = 2;

ТабЗнач.Сотрудник = "Петров Петр Петрович";

ТабЗнач.Должность = "Бухгалтер";

ТабЗнач.Оклад = 10000;
//обычно строки добавляются в цикле

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

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

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

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

.....ТабЗнач.Номер = СпрСотр.Код;

.....ТабЗнач.Сотрудник = СпрСотр.ТекущийЭлемент(); //следите за типом колонки!

.....ТабЗнач.Должность = СпрСотр.Должность;

.....ТабЗнач.Оклад = СпрСотр.Оклад;

КонецЦикла;




Добавление значений в список


Синтаксис: ДобавитьЗначение(<значение>,[<представление>]);
//у каждого значения в СпискеЗначений есть экранное представление

//если оно не указано, то используется стандартное строковое представление объекта
СписокЗнач.ДобавитьЗначение("Иванов Иван Иванович");

СписокЗнач.ДобавитьЗначение(Сотрудник);

СписокЗнач.ДобавитьЗначение(1,"Значение №1");
СписокЗнач.УстановитьЗначение(3,3,"Значение №3"); //установить новое значение и представление 3-й позиции




Доходы


Определять доходы магазина можно по регистру Доходы с помощью отчетов СводнаяТаблица и ОтчетПоРегистру, разработанных фирмой КИНТ.
Реверси




Документ "Доход"


Экранная форма документа выглядит следующим образом:
Документ

Модуль проведения:
Процедура ОбработкаПроведения()
Регистр.Доходы.Участник = Участник;

Регистр.Доходы.Статья = Статья;

Регистр.Доходы.Сумма = Сумма;

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

Регистр.Кошельки.Кошелек = Кошелек;

Регистр.Кошельки.Сумма = Сумма;

Регистр.Кошельки.ДвижениеПриходВыполнить();
КонецПроцедуры




Документ "Перевод"


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

Модуль проведения:
Процедура ОбработкаПроведения()
Регистр.Кошельки.Кошелек = КошелекОткуда;

Регистр.Кошельки.Сумма = Сумма;

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

Регистр.Кошельки.Кошелек = КошелекКуда;

Регистр.Кошельки.Сумма = Сумма;

Регистр.Кошельки.ДвижениеПриходВыполнить();
КонецПроцедуры




Документ "Письмо"


Данный документ имеет шапку и табличную часть. В шапке отражается, кто написал письмо, кому оно адресуется (адресат), тема письма, текст письма и флажок важности. Табличная часть содержит приложения к письму. Приложением может быть элемент любого справочника или любой документ с небольшим сопроводительным текстом. Данная почта отличается от Outlook тем, что позволяет прицеплять к письму конкретные объекты базы 1С, в которой работают пользователи. Т.е. пользователь может отправить такое письмо: "Света, посмотри, что творится с этой накладной!" и прицепить к письму саму накладную.
Документ

А на вкладке Приложения прицеплены сами товары с комментариями!
Документ

При сохранении письма производится следующее. У адресата устанавливается в единицу флажок ЕстьПисьмо в спр. Пользователи. Каждые несколько секунд (интервал настраивается в константах) производится проверка новой почты, если флажок взведен и есть новые непрочитанные письма, о которых еще не было оповещения, тогда пользователю выдается сообщение "Пришла почта! Прочитать?". Флажок ЕстьПисьмо снимается и утех писем, о которых пользователь был оповещен, устанавливается флажок БылоОповещение. Если пользователь ответит Да, тогда откроется его почтовый ящик (журнал Письма).




Документ "Потеря книги"


Экранная форма документа выглядит следующим образом:
Документ

Модуль формы см. в конфигурации "Мини-библиотека".
Модуль проведения:
Процедура ОбработкаПроведения()
СпрКниги = создатьОбъект("Справочник.Книги");

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

Пока ПолучитьСтроку()=1 Цикл
СпрКниги.НайтиЭлемент(Книга);

СпрКниги.Статус = Перечисление.СтатусКниги.Списана;

СпрКниги.Читатель = 0;

СпрКниги.ДатаВыдачи = 0;

СпрКниги.СрокВозврата = 0;

СпрКниги.Записать();
КонецЦикла;

УстановитьРеквизитСправочника(Читатель, "Блокирован", Перечисление.ДаНет.Да, ДатаДок);

УстановитьРеквизитСправочника(Читатель, "Блокирован", Перечисление.ДаНет.Нет, ДатаДок + Константа.КолвоДнейБлокировки);
КонецПроцедуры




Документ "Приход"


Экранная форма документа Приход выглядит следующим образом:
Документ

Модуль проведения:
Процедура ОбработкаПроведения()
ВыбратьСтроки();

Пока ПолучитьСтроку()=1 Цикл
Регистр.ОстаткиМатериалов.Материал = Материал;

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

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

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




Документ "Продление книги"


Экранная форма документа выглядит следующим образом:
Документ

Модуль формы см. в конфигурации "Мини-библиотека".
Модуль проведения:
Процедура ОбработкаПроведения()
СпрКниги = создатьОбъект("Справочник.Книги");

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

Пока ПолучитьСтроку()=1 Цикл
Если Число(НовыйСрокВозврата)<>0 Тогда
СпрКниги.НайтиЭлемент(Книга);

СпрКниги.СрокВозврата = НовыйСрокВозврата;

СпрКниги.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры




Документ "Расход"


Экранная форма документа выглядит следующим образом:
Документ

Модуль проведения:
Процедура ОбработкаПроведения()
Регистр.Расходы.Участник = Участник;

Регистр.Расходы.Статья = Статья;

Регистр.Расходы.Сумма = -Сумма;

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

Регистр.Кошельки.Кошелек = Кошелек;

Регистр.Кошельки.Сумма = Сумма;

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




Документ "Расход"


Экранная форма документа Расход выглядит следующим образом (отличается только названием):
Документ

Модуль проведения:
Процедура ОбработкаПроведения()
ВыбратьСтроки();

Пока ПолучитьСтроку()=1 Цикл
Регистр.ОстаткиМатериалов.Материал = Материал;

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

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

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




Документ "Сообщение"


Данный документ является коротким сообщением в общий чат. При сохранении документа он отражается в журнале Чат.
Документ





Документ "Возврат книги"


Экранная форма документа выглядит следующим образом:
Документ

Модуль формы см. в конфигурации "Мини-библиотека".
Модуль проведения:
Процедура ОбработкаПроведения()
СпрКниги = создатьОбъект("Справочник.Книги");

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

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

Пока ПолучитьСтроку()=1 Цикл
СпрКниги.НайтиЭлемент(Книга);

Если СпрКниги.СрокВозврата < ДатаДок Тогда
СпрЧитатели.НайтиЭлемент(Читатель);

СпрЧитатели.КоличествоПредупреждений = СпрЧитатели.КоличествоПредупреждений + 1;

СпрЧитатели.Записать();

Если СпрЧитатели.КоличествоПредупреждений > Константа.МаксКолвоПредупреждений Тогда
УстановитьРеквизитСправочника(Читатель, "Блокирован",Перечисление.ДаНет.Да, ДатаДок);

УстановитьРеквизитСправочника(Читатель, "Блокирован",Перечисление.ДаНет.Нет, ДатаДок + Константа.КолвоДнейБлокировки);
КонецЕсли;
КонецЕсли;

СпрКниги.Статус = Перечисление.СтатусКниги.Свободна;

СпрКниги.Читатель = 0;

СпрКниги.ДатаВыдачи = 0;

СпрКниги.СрокВозврата = 0;

СпрКниги.Записать();
КонецЦикла;
КонецПроцедуры




Документ "Ввод начальных остатков"


Экранная форма документа выглядит следующим образом:
Документ

Модуль проведения:
Процедура ОбработкаПроведения()
ВыбратьСтроки();

Пока ПолучитьСтроку()=1 Цикл
Регистр.Кошельки.Кошелек = Кошелек;

Регистр.Кошельки.Сумма = Сумма;

Регистр.Кошельки.ДвижениеПриходВыполнить();
КонецЦикла;
КонецПроцедуры




Документ "Выдача книги"


Экранная форма документа выглядит следующим образом:
Документ

Модуль формы см. в конфигурации "Мини-библиотека".
Модуль проведения:
Процедура ОбработкаПроведения()
СпрКниги = создатьОбъект("Справочник.Книги");

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

Пока ПолучитьСтроку()=1 Цикл
СпрКниги.НайтиЭлемент(Книга);

СпрКниги.Статус = Перечисление.СтатусКниги.Выдана;

СпрКниги.Читатель = Читатель;

СпрКниги.ДатаВыдачи = ДатаДок;

СпрКниги.СрокВозврата = СрокВозврата;

СпрКниги.Записать();
КонецЦикла;
КонецПроцедуры




Домашнее задание


Заставьте компьютер играть в эту игру. Придумайте алгоритм для поиска всех лис за минимальное число ходов.
Конкурент-магазин




Домашнее задание


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




Дополнение




Поставщик




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






Склад




С.Склады











Дополнение


Товар
С.Комплектующие
Кол
Число 5.0
+, И
ЦенаБНДС
Цена без НДС
Число 7.2
+
ЦенаСНДС
Цена с НДС
Число 7.2
+
СуммаБНДС
Сумма без НДС
Число 13.2
+, И
СуммаНДС
Сумма НДС
Число 13.2
+, И
СуммаСНДС
Сумма с НДС
Число 13.2
+, И
Отредактируем журнал ПриходныеНакладные. Добавим в него две графы – Кол из реквизита таблицы Кол, и Сумма из реквизита СуммаСНДС. Настроим форму журнала.

Перейдем к форме документа. Создаем ее. Поля АвторДокумента и Курс делаем недоступными. В полях ввода Валюта и ДатаКурса пишем формулу Валюта(). Поля табличной части СуммаБНДС, СуммаНДС, СуммаСНДС делаем недоступными. В поле Товар пишем формулу Товар(), в поле Кол – Кол(), в поле ЦенаБНДС – ЦенаБНДС(), в поле ЦенаСНДС – ЦенаСНДС(). Под таблицей добавим текст с формулой для вычисления суммы по колонке Итог("Кол"), Итог("СуммаБНДС"), Итог("СуммаБНДС"). В модуле формы документа пишем:

Перем СтВалюта;

Перем СтДатаКурса;

Перем СтКурс;

//==========================================================

Процедура ВводНового()

АвторДокумента=СокрЛП(ИмяПользователя());

ФирмаДокумента=Константа.ОснФирма;

Валюта=Константа.ОснВалюта;

ДатаКурса=ДатаДок;

Курс=1;

СтВалюта=Валюта;

СтДатаКурса=ДатаКурса;

СтКурс=Курс;

Поставщик = Константа.ОснПоставщик;

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

//==========================================================

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

СтВалюта=Валюта;

СтДатаКурса=ДатаКурса;

СтКурс=Курс;

ПриЗаписиПерепроводить(1);

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

//==========================================================

Процедура Валюта()

// При смене валюты, либо даты курса

КурсС=СтКурс;

КратС=СтВалюта.Кратность;

КурсН=Валюта.Курс.Получить(ДатаКурса);

КратН=Валюта.Кратность;

Коэфф=Окр((КурсС*КратН)/(КурсН*КратС),6,1); // переводим в валюту документа




Курс=КурсН;

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

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

// Обходим строки

ЦенаБНДС=Окр(ЦенаБНДС*Коэфф,2,1);

ЦенаСНДС=Окр(ЦенаСНДС*Коэфф,2,1);

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

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

СуммаНДС=СуммаСНДС-СуммаБНДС;

КонецЦикла;

СтВалюта=Валюта;

СтДатаКурса=ДатаКурса;

СтКурс=Курс;

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

//==========================================================

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

// Изменили товар, пересчитаем цену с НДС

ЦенаСНДС=Окр(ЦенаБНДС*(1+(Товар.НДС.Значение/100)),2,1);

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

СуммаНДС=СуммаСНДС-СуммаБНДС;

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

//==========================================================

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

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

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

СуммаНДС=СуммаСНДС-СуммаБНДС;

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

//==========================================================

Процедура ЦенаБНДС()

ЦенаСНДС=Окр(ЦенаБНДС*(1+(Товар.НДС.Значение/100)),2,1);

// Определим цену с НДС по цене без НДС

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

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

СуммаНДС=СуммаСНДС-СуммаБНДС;

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

//==========================================================

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

ЦенаБНДС=Окр(ЦенаСНДС*(1-(Товар.НДС.ОбрЗначение/100)),2,1);

// Определим цену без НДС по цене с НДС

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

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

СуммаНДС=СуммаСНДС-СуммаБНДС;

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

Дополнение


Теперь переходим к модулю документа. В этом документе наша операция будет уже посложней, в одной операции будет объединено несколько проводок, причем одна проводка будет относиться ко всему документу целиком, а остальные будут формироваться по строкам документа. Пишем следующую процедуру

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

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

// Если склад не указан

Сообщить("Документ Приходная накладная №"+НомерДок+" от "+ДатаДок+"



|не проведен.

|Не выбран склад получатель");

// Делаем сообщение

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

// Указываем, что документ проводить не надо

Возврат;

// Выходим из процедуры

КонецЕсли;

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

Сообщить("Документ Приходная накладная №"+НомерДок+" от "+ДатаДок+"

|не проведен.

|Не выбран поставщик");

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

Возврат;

КонецЕсли;

КурсД=Курс;

КратД=Валюта.Кратность;

КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);

КратУ=Константа.ОснВалюта.Кратность;

Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1);

// Переводим в валюту документа

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

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

// Обходим строки

ПривязыватьСтроку(НомерСтроки);

// Здесь мы хотим указать какая строка документа вызвала эту проводку

Операция.НоваяПроводка();

Операция.Дебет.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);

Операция.Дебет.МестоХранения = Склад;

Операция.Дебет.Комплектующее = Товар;

Операция.Дебет.ПриходнаяНакладная = ТекущийДокумент();

Операция.Кредит.Счет = СчетПоКоду("60",ПланыСчетов.Наш);

Операция.Кредит.Контрагент = Поставщик;

Операция.Кредит.ПриходнаяНакладная = ТекущийДокумент();

Операция.Количество = Кол;

Операция.Сумма = Окр(СуммаБНДС*Коэфф,2,1);

Операция.Фирма = ФирмаДокумента;

Операция.Комментарий = "Поступление комплектующих";

Операция.НомерЖурнала = "6";

КонецЦикла;

ПривязыватьСтроку(0);

// Эта проводка по всему документу вцелом

Операция.НоваяПроводка();

Операция.Дебет.Счет = СчетПоКоду("19.3",ПланыСчетов.Наш);

Операция.Кредит.Счет = СчетПоКоду("60",ПланыСчетов.Наш);



Операция.Кредит.Контрагент = Поставщик;

Операция.Кредит.ПриходнаяНакладная = ТекущийДокумент();

Операция.Сумма = Окр(Итог("СуммаНДС")*Коэфф,2,1);

Операция.Фирма = ФирмаДокумента;

Операция.Комментарий = "Учет НДС по поступ. комплектующим";

Операция.НомерЖурнала = "6";

Операция.Содержание = "Поступление комплектующих";

Операция.СуммаОперации = Окр(Итог("СуммаСНДС")*Коэфф,2,1);

Операция.Автор = АвторДокумента;

Операция.Записать();

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

Теперь, когда создан документ "Приходная накладная", нам надо внести соответствующую поправку в Субконто ПриходнаяНакладная. Укажем в этом Субконто тип как Д.ПриходнаяНакладная.

2.34 Работа с документом ПриходнаяНакладная.

Документ "Приходная накладная" создан, в интерфейс внесен сам документ и его журнал. Давайте попробуем поработать с этим документом. Войдем в 1С:Предприятие и создадим Приходную накладную №1 от 02.01.2001.

Дополнение


Цены попытаемся вводить как с НДС, так и без НДС. Попробуем менять валюту. И наконец, проведем этот документ и посмотрим на получившуюся операцию и проводки. Создана одна операция на сумму 270 рублей и четыре проводки, три по дебету 10-ого счета на сумму 75, 100 и 50 рублей, и одна по дебету 19-ого счета на сумму 45 рублей. Документ попробуем проводить с разной валютой.

Используем теперь документ "Учет НДС" для списания с налогов суммы уплаченного поставщику НДС за купленные нами комплектующие. Вводим УчетНДС №1 от 03.01.2001. Сумма – 45 рублей. Проводим. Смотрим на операцию и проводку. Посмотрим как действует журнал проводок (меню Действия, команда "Перейти в журнал проводок"). Попробуем разделить по журналам нашим флажком. Все работает.

Глава 7

2.37 Документ НарядНаСборку.

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



Проводка документа (Д 20 – К 10.2). Документ должен будет списать со склада некоторое количество комплектующих, при этом списание должно идти по методу FIFO, в первую очередь из более ранних накладных.

Документ будет помещен в специальный журнал.

Идентификатор: НарядНаСборку

Журнал: НарядыНаСборку

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

Длина: 5 Тип: число

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

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

Проводить: да

Автоматическое удаление движений: да

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

Бухгалтерский учет: да

Расчет: нет

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

Создавать операцию: Всегда Редактировать операцию: нет




Дополнение




Склад




С.Склады






Сборщик




С.Сотрудники











Дополнение


Изделие
С.Изделия
Кол
Число 5.0
+
В журнал добавим графу "Сборщик". Создаем форму документа.

Поля Валюта, ДатаКурса, Курс удаляем. Поле АвторДокумента делаем недоступным. Добавляем кнопку [Заявка] с формулой Заявка(), по этой кнопке мы будем распечатывать перечень входящих в изделия комплектующих, с указанием общего количества.

В табличную часть добавим поле текст с функцией Ост(Склад,Изделие), эта колонка будет показывать, для какого количества изделий хватит комплектующих (но, эта функция будет показывать только возможное количество, она, разумеется, не учитывает возможность участия комплектующего в разных изделиях). В поле табличной части Кол добавляем процедуру Кол(), эта процедура будет проверять, не превышает ли указанное количество изделий возможное, исходя из запасов на складе. Еще раз подобную проверку мы будем делать в модуле проведения.

Дополнение


В модуле формы документа пишем:

Процедура ВводНового()

АвторДокумента=СокрЛП(ИмяПользователя());

ФирмаДокумента=Константа.ОснФирма;

Валюта=Константа.ОснВалюта;

ДатаКурса=ДатаДок;

Курс=1;

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

//==========================================================

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

ПриЗаписиПерепроводить(1);

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

//==========================================================

Процедура Заявка()

// Печать спецификации

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

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

ТабЗн.НоваяКолонка("Кол","Число",12,0);

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

// Подчиненный справочнику Изделия справочник Комплектация

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

// Обходим строки документа

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

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

// Выбираем комплектующие по изделию

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

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




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

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

ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;

// Это мы определили, что входит в комплект

ТабЗн.Кол=Кол;

// И сколько

КонецЦикла;

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

КонецЦикла;

СпрКом="";

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

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

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

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

// Суммируем строки с одинаковыми комплектующими

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

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

Стр=1;

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

Комп=ТабЗн.Ком;

НазвРодителя=СокрЛП(Комп.Родитель.Наименование);

Поз1=Найти(НазвРодителя,"(");

Поз2=Найти(НазвРодителя,")");

ГОСТ=Сред(НазвРодителя,Поз1+1,Поз2-Поз1-1);

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

Колич=ТабЗн.Кол;

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

Стр=Стр+1;

КонецЦикла;

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

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

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

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

//==========================================================

Функция Ост(Скл,Изд)

// Функция с двумя параметрами на входе: Склад и Изделие

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

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

БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");

БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);

БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);

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

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

// Обходим все комплектующие, входящие в изделие

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

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



Ком=СКом.Комплектующее;

БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Скл,2);

БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);

// Отбираем по указанному складу и текущей комплектующей

БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");

КолКом=БухИтоги.СКД(3);

// Выясняем, сколько штук этих комплектующих еще есть на складе

СпЗн.ДобавитьЗначение(КолКом);

// Добавляем в список

КонецЦикла;

СпрКом="";

ИОст=0;

// Ищем минимальное значение в списке

Для ЧЦ=1 По СпЗн.РазмерСписка() Цикл

ТТТ="";

Если ЧЦ=1 Тогда

КолСп=СпЗн.ПолучитьЗначение(ЧЦ,ТТТ);

ИОст=КолСп;

Иначе

КолСп=СпЗн.ПолучитьЗначение(ЧЦ,ТТТ);

Если ИОст>КолСп Тогда

ИОст=КолСп;

КонецЕсли;

КонецЕсли;

КонецЦикла;

Возврат(ИОст);

// Выдаем это минимальное значение

КонецФункции

//==========================================================

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

ОстКомпл=Ост(Склад,Изделие);

// Выясняем остаток на складе

Если Кол>ОстКомпл Тогда

// Если запросили больше

Кол=ОстКомпл;

// Даем сколько есть

КонецЕсли;

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

Теперь пропишем процедуру проведения. Здесь у нас будет формирование движения партий, но не по строкам документа, а по комплектующим, определяемым через эти строки. Проводки будут только одного типа (Д 20 – К 10.2). Здесь же будет проверка, не запрашиваем ли мы комплектующих больше, чем есть на складе.

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

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

Сообщить("Документ Наряд на сборку №"+НомерДок+"

|от "+ДатаДок+" не проведен.

|Не выбран склад заготовок");

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



Возврат;

КонецЕсли;

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

Сообщить("Документ Наряд на сборку №"+НомерДок+"

|от "+ДатаДок+" не проведен.

|Не указан сборщик");

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

Возврат;

КонецЕсли;

// Это были обычные проверки

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

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

ТабЗн.НоваяКолонка("Кол","Число",12,0);

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

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

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

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

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

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

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

ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;

ТабЗн.Кол=Кол;

КонецЦикла;

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

КонецЦикла;

БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");

БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);

БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);

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

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

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

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

Ком=ТабЗн.Ком;

Колич=ТабЗн.Кол;

БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);

БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);

БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");

КолКом=БухИтоги.СКД(3);

Если Колич>КолКом Тогда

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

Сообщить(Строка(Ком));

КонецЕсли;

КонецЦикла;

// Если посмотреть модуль документа, это похоже на процедуру Заявка()



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

Сообщить("Документ Наряд на сборку №"+НомерДок+"

|от "+ДатаДок+" не проведен.

|Заказ по вышеперечисленным позициям

|превышает остаток на складе");

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

Возврат;

КонецЕсли;

// Отказ от проведения по причине нехватки комплектующих

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

ТабЗн="";

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

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

ТабПар.НоваяКолонка("Кол","Число",10,0);

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

СуммаОпер=0;

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

Пока ПолучитьСтроку()=1 Цикл // По Изделию

// Обходим строки

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

Изд=Изделие;

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

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

Пока СпрКом.ПолучитьЭлемент()=1 Цикл // По Комплектующей

// Обходим комплектующие

Колич=Кол;

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

БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);

БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);

БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);

БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");

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

БухИтоги.ВыбратьСубконто(3);

// Выбираем только третье!!! субконто

Пока БухИтоги.ПолучитьСубконто(3)=1 Цикл

// Определяем партии

ДокП=БухИтоги.Субконто(3);

КолП=БухИтоги.СКД(3);

СумП=БухИтоги.СКД(1);

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

ТабПар.Док=ДокП;



ТабПар.Кол=КолП;

ТабПар.Сум=СумП;

КонецЦикла;

ТабПар.Сортировать("1+");

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

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

// Обходим партии

ДокП=ТабПар.Док;

КолП=ТабПар.Кол;

СумП=ТабПар.Сум;

Если Колич>КолП Тогда

ПривязыватьСтроку(НС);

Операция.НоваяПроводка();

Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);

Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);

Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;

Операция.Дебет.Изделие = Изделие;

Операция.Дебет.НарядНаКомплектацию = ТекущийДокумент();

Операция.Кредит.МестоХранения = Склад;

Операция.Кредит.Комплектующее = Ком;

Операция.Кредит.ПриходнаяНакладная = ДокП;

Операция.Фирма = ФирмаДокумента;

Операция.Комментарий = "Передача комплектующих на сборку";

Операция.НомерЖурнала = "10";

Операция.Сумма = СумП;

Операция.Количество = КолП;

Колич=Колич-КолП;

СуммаОпер=СуммаОпер+СумП;

// Накапливаем сумму операции по каждой проводке

Иначе

СумО=Окр(Колич*(СумП/КолП),2,1);

// Определяем сумму остатка через цену партии



ПривязыватьСтроку(НС);

Операция.НоваяПроводка();

Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);

Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);

Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;

Операция.Дебет.Изделие = Изделие;

Операция.Дебет.НарядНаКомплектацию = ТекущийДокумент();

Операция.Кредит.МестоХранения = Склад;

Операция.Кредит.Комплектующее = Ком;

Операция.Кредит.ПриходнаяНакладная = ДокП;

Операция.Фирма = ФирмаДокумента;

Операция.Комментарий = "Передача комплектующих на сборку";

Операция.НомерЖурнала = "10";

Операция.Сумма = СумО;

Операция.Количество = Колич;

СуммаОпер=СуммаОпер+СумО;

// Накапливаем сумму операции по каждой проводке

Прервать;

// Все кончилось, больше партии по этому комплектующему обходить незачем

КонецЕсли;

КонецЦикла; // По Партии

КонецЦикла; // По Комплектующей

КонецЦикла; // По Изделию

Операция.Содержание = "Запуск производства";

Операция.СуммаОперации = СуммаОпер;

Операция.Автор = АвторДокумента;

Операция.Записать();

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

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



Например, в изделии А (10 шт.) есть комплектующая К, и в изделии Б (10 шт.) есть комплектующая К. Суммарно изделие К должно быть списано из партии 1 и из партии 2 по 10 штук, но этот механизм дважды спишет К из партии 1. А это неправильно. Перепишем эту процедуру заново:

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

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

Сообщить("Документ Наряд на сборку №"+НомерДок+" от "+ДатаДок+"

|не проведен.

|Не выбран склад заготовок");

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

Возврат;

КонецЕсли;

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

Сообщить("Документ Наряд на сборку №"+НомерДок+" от "+ДатаДок+"

|не проведен.

|Не указан сборщик");

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

Возврат;

КонецЕсли;

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

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

ТабЗн.НоваяКолонка("Кол","Число",12,0);

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

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

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

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

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

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

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

ТабЗн.Ком=СпрКом.ТекущийЭлемент().Комплектующее;

ТабЗн.Кол=Кол;

КонецЦикла;

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

КонецЦикла;

БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");

БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);

БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);

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

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

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

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

Ком=ТабЗн.Ком;



Колич=ТабЗн.Кол;

БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);

БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,Ком,2);

БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");

КолКом=БухИтоги.СКД(3);

Если Колич>КолКом Тогда

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

Сообщить(Строка(Ком));

КонецЕсли;

КонецЦикла;

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

Сообщить("Документ Наряд на сборку №"+НомерДок+" от "+ДатаДок+"

|не проведен.

|Заказ по вышеперечисленным позициям

|превышает остаток на складе");

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

Возврат;

КонецЕсли;

// Без изменений

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

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

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

ТабКом.НоваяКолонка("Кол","Число",10,0);

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

// В этой таблице мы будем хранить список комплектующих в разрезе партий

// в количестве, достаточном для списания

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

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

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

КомП=ТабЗн.Ком;

КолКом=ТабЗн.Кол;

БухИтоги.ИспользоватьСубконто(ВидыСубконто.МестоХранения,Склад,2);

БухИтоги.ИспользоватьСубконто(ВидыСубконто.Комплектующее,КомП,2);

БухИтоги.ИспользоватьСубконто(ВидыСубконто.ПриходнаяНакладная,,1);

БухИтоги.ВыполнитьЗапрос(,ДатаДок,"10.2");

БухИтоги.ВыбратьСубконто(3);

Пока БухИтоги.ПолучитьСубконто(3)=1 Цикл

ДокП=БухИтоги.Субконто(3);

КолП=БухИтоги.СКД(3);



СумП=БухИтоги.СКД(1);

Если КолКом>0 Тогда

// Заполняем таблицу по комплектующим-партиям

ТабКом.НоваяСтрока();

ТабКом.Ком=КомП;

ТабКом.Док=ДокП;

ТабКом.Кол=КолП;

ТабКом.Сум=СумП;

КолКом=КолКом-КолП;

Иначе

Прервать;

// Чтобы не выбирать лишних партий

КонецЕсли;

КонецЦикла;

КонецЦикла;

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

ТабЗн="";

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

СуммаОпер=0;

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

Пока ПолучитьСтроку()=1 Цикл // По Изделию

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

Изд=Изделие;

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

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

Пока СпрКом.ПолучитьЭлемент()=1 Цикл // По Комплектующей

Колич=Кол;

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

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

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

// Выбираем партии из динамической таблицы!

КомП=ТабКом.Ком;

Если КомП<>КомТ Тогда

Продолжить;

// Запрашиваемая комплектующая не соответствует строке в таблицу, идем дальше

КонецЕсли;

ДокП=ТабКом.Док;

КолП=ТабКом.Кол;

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

// Партия уже опустошена, пропускаем

Продолжить;

КонецЕсли;

СумП=ТабКом.Сум;

СтрП=ТабКом.НомерСтроки;

Если Колич>КолП Тогда

ПривязыватьСтроку(НС);



Операция.НоваяПроводка();

Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);

Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);

Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;

Операция.Дебет.Изделие = Изделие;

Операция.Дебет.НарядНаКомплектацию = ТекущийДокумент();

Операция.Кредит.МестоХранения = Склад;

Операция.Кредит.Комплектующее = КомП;

Операция.Кредит.ПриходнаяНакладная = ДокП;

Операция.Фирма = ФирмаДокумента;

Операция.Комментарий = " Передача комплектующих на сборку";

Операция.НомерЖурнала = "10";

Операция.Сумма = СумП;

Операция.Количество = КолП;

Колич=Колич-КолП;

СуммаОпер=СуммаОпер+СумП;

ТабКом.УстановитьЗначение(СтрП,"Кол",0);

ТабКом.УстановитьЗначение(СтрП,"Сум",0);

// Опустошаем партию полностью

Иначе

СумО=Окр(Колич*(СумП/КолП),2,1);

ПривязыватьСтроку(НС);

Операция.НоваяПроводка();

Операция.Дебет.Счет = СчетПоКоду("20",ПланыСчетов.Наш);

Операция.Кредит.Счет = СчетПоКоду("10.2",ПланыСчетов.Наш);

Операция.Дебет.ВидЗатрат = Перечисление.ВидыЗатрат.НаКомплектующие;

Операция.Дебет.Изделие = Изделие;



Операция.Дебет.НарядНаКомплектацию = ТекущийДокумент();

Операция.Кредит.МестоХранения = Склад;

Операция.Кредит.Комплектующее = КомП;

Операция.Кредит.ПриходнаяНакладная = ДокП;

Операция.Фирма = ФирмаДокумента;

Операция.Комментарий = "Передача комплектующих на сборку";

Операция.НомерЖурнала = "10";

Операция.Сумма = СумО;

Операция.Количество = Колич;

СуммаОпер=СуммаОпер+СумО;

ТабКом.УстановитьЗначение(СтрП,"Кол",КолП-Колич);

ТабКом.УстановитьЗначение(СтрП,"Сум",СумП-СумО);

// Опустошаем партию частично и переходим к следующей комплектующей

Прервать;

КонецЕсли;

КонецЦикла; // По Партии

КонецЦикла; // По Комплектующей

КонецЦикла; // По Изделию

Операция.Содержание = "Запуск производства";

Операция.СуммаОперации = СуммаОпер;

Операция.Автор = АвторДокумента;

Операция.Записать();

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

Новый вариант хотя и сложнее, но работает правильно. И даже быстрее, так как обращений к Бухгалтерским итогам будет меньше или столько же, ведь они вынесены за цикл по изделиям.

Проверим работу нашего документа с разными наборами данных.

2.40 Документ ПриходныйОрдер.

Товар отгружен, пора получить за него денежки. Деньги мы будем получать с покупателя наличными в кассу по Приходному ордеру. Проводка в документе будет всего одна (Д 50.1 – К 62). Списывать долг с конкретного покупателя мы будем в разрезе конкретной накладной на отгруз. Причем, если сумма в ордере больше непогашенного остатка по указанной накладной, то мы раскидаем остаток прихода денег по остальным непогашенным накладным клиента, а если накладная не указана, то спишем долг по самой ранней накладной. Этот документ будет очень похож на Расходный ордер, поэтому просто скопируем его и внесем небольшие изменения.



Сведем данные по документу в таблицу:

Идентификатор: ПриходныйОрдер

Журнал: Кассовые

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

Длина: 5 Тип: число

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

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

Проводить: да

Автоматическое удаление движений: да

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

Бухгалтерский учет: да

Расчет: нет

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

Создавать операцию: Всегда Редактировать операцию: нет




Дополнение




Плательщик


от кого


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






Основание


за что платит


Д.РасходнаяНакладная






Сумма


сколько


Число 12.2


3, +









Дополнение










В журнале "Кассовые" добавим в графу таблицы – Сумма из реквизита документа "ПриходныйОрдер" Сумма.

Перейдем к редактированию формы документа. Сделаем все аналогично с Расходным ордером. Модуль формы напишите сами, он тоже аналогичен.

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

Сведем все в таблицу:













Идентификатор: Ведомость

Журнал: Ведомости

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

Длина: 5 Тип: число

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

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

Проводить: да

Автоматическое удаление движений: да

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

Бухгалтерский учет: да

Расчет: нет

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

Создавать операцию: Всегда Редактировать операцию: да






Дополнение




Сотрудник




С.Сотрудники






Сумма




Число 10.2


+, И










Документ в отдельном журнале.

Приведем форму журнала в вид, нравящийся нам.

Отредактируем форму документа.

Дополнение


Поля АвторДокумента и Курс делаем недоступными. В поля Валюта, ДатаКурса добавляем формулу Валюта(). Вставляем кнопку [Заполнить] с формулой Заполнить(). Вставляем поле текст с формулой Итог("Сумма") – для итога по колонке.

В модуле формы документа пишем:

Перем СтВалюта;

Перем СтДатаКурса;

Перем СтКурс;

//==========================================================

Процедура ВводНового()

АвторДокумента=СокрЛП(ИмяПользователя());

ФирмаДокумента=Константа.ОснФирма;

Валюта=Константа.ОснВалюта;

ДатаКурса=ДатаДок;

Курс=1;

СтВалюта=Валюта;

СтДатаКурса=ДатаКурса;

СтКурс=Курс;

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

//==========================================================

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

СтВалюта=Валюта;

СтДатаКурса=ДатаКурса;

СтКурс=Курс;

ПриЗаписиПерепроводить(1);

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

//==========================================================

Процедура Валюта()

КурсС=СтКурс;

КратС=СтВалюта.Кратность;

КурсН=Валюта.Курс.Получить(ДатаКурса);

КратН=Валюта.Кратность;

Коэфф=Окр((КурсС*КратН)/(КурсН*КратС),6,1);

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

Курс=КурсН;

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

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

Сумма=Окр(Сумма*Коэфф,2,1);

КонецЦикла;

СтВалюта=Валюта;

СтДатаКурса=ДатаКурса;

СтКурс=Курс;

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

//==========================================================

Процедура Заполнить()

КурсД=Курс;

КратД=Валюта.Кратность;

КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);

КратУ=Константа.ОснВалюта.Кратность;

Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1); // переводим в валюту документа

УдалитьСтроки();

// Очищаем табличную часть документа




БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");

БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Наш);

БухИтоги.ИспользоватьРазделительУчета(ФирмаДокумента);

БухИтоги.ИспользоватьСубконто(ВидыСубконто.Сотрудник,,1);

БухИтоги.ВыполнитьЗапрос(,ТекущаяДата(),"70");

БухИтоги.ВыбратьСубконто(1);

Пока БухИтоги.ПолучитьСубконто(1)=1 Цикл

Сотр=БухИтоги.Субконто(1);

ИОст=БухИтоги.СКК(1);

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

// Заполняем новыми строками

Сотрудник=Сотр;

Сумма=Окр(ИОст*Коэфф,2,1);

КонецЦикла;

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

Напишем модуль проведения документа. Он очень простой.

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

КурсД=Курс;

КратД=Валюта.Кратность;

КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);

КратУ=Константа.ОснВалюта.Кратность;

Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1);

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

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

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

Операция.НоваяПроводка();

Операция.Дебет.Счет = СчетПоКоду("70",ПланыСчетов.Наш);

Операция.Кредит.Счет = СчетПоКоду("50.1",ПланыСчетов.Наш);

Операция.Дебет.Сотрудник = Сотрудник;

Операция.Сумма = Окр(Сумма*Коэфф,2,1);

Операция.Фирма = ФирмаДокумента;

Операция.Комментарий = "Выплата зарплаты из кассы";

Операция.НомерЖурнала = "1";

КонецЦикла;

Операция.Содержание = "Выплата зарплаты";

Операция.СуммаОперации = Окр(Итог("Сумма")*Коэфф,2,1);

Операция.Автор = АвторДокумента;

Операция.Записать();

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

Как видите, все просто и коротко. Проверьте работоспособность документа в 1С:Предприятии. И попробуйте поредактировать операцию, создаваемую документом.

Глава 8

2.42 Отчет по остаткам на складе готовой продукции.

Дополнение
В принципе, конфигурация создана. Осталось только добавить пару отчетиков. Один отчет – Счет60 у нас уже есть. Создадим теперь отчет по остаткам на складе.



Вводим новый отчет "ОстаткиГотовойПродукции".

В модуль формы пишем:

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

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

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

//==========================================================

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

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

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

Ит = СоздатьОбъект("БухгалтерскиеИтоги");

Ит.ИспользоватьПланСчетов(ПланыСчетов.Наш);

Ит.ИспользоватьРазделительУчета(Константа.ОснФирма);

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

Суб=1;

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

Ит.ИспользоватьСубконто(ВидыСубконто.МестоХранения,ВСклад,2);

Скл="По складу: "+СокрЛП(Строка(ВСклад));

Суб=2;

КонецЕсли;

Ит.ИспользоватьСубконто(ВидыСубконто.Изделие,,1);

Ит.ВыполнитьЗапрос(,ДатО,"40");

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

ИтКол=0;

ИтСумС=0;

ИтСумР=0;

ИтСумН=0;

Ит.ВыбратьСубконто(Суб);

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

Изд=Ит.Субконто(Суб);

Цен=Изд.Цена.Получить(ДатО);

Кол=Ит.СКД(3);

СумС=Ит.СКД(1);

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

СумН=Окр(СумР*(1+Изд.НДС.Значение/100),2,1);

ИтКол=ИтКол+Кол;

ИтСумС=ИтСумС+СумС;

ИтСумР=ИтСумР+СумР;

ИтСумН=ИтСумН+СумН;

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

КонецЦикла;

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

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

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

Таб.Показать("Сформировать","");

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

Делаем шаблон печатной формы

Дополнение


2.43 Отчет по покупателям.

Дополнение
Создадим теперь отчет по 62-ому счету - "Покупатели". В поле ДатН пишем формулу Дат("Н"), а в поле ДатК – Дат("К"). В модуль формы:

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

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



// Создаем запрос по базе данных

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

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

|Пок = Операция.Субконто.Контрагент;

|Сум = Операция.Сумма;

|Сч = Операция.Счет;

|Функция СумСНК = СНК(Сум) когда (Сч=СчетПоКоду(""62""));

|Функция СумСНД = СНД(Сум) когда (Сч=СчетПоКоду(""62""));

|Функция СумКО = КО(Сум) когда (Сч=СчетПоКоду(""62""));

// Нас интересуют кредитовые

|Функция СумДО = ДО(Сум) когда (Сч=СчетПоКоду(""62""));

// и дебетовые обороты

|Функция СумСКК = СКК(Сум) когда (Сч=СчетПоКоду(""62""));

|Функция СумСКД = СКД(Сум) когда (Сч=СчетПоКоду(""62""));

|Условие (Сч=СчетПоКоду(""62""));

// Другие чтоб не лезли... Если не поставить - в отчет

// Поставщики попадут с нулями

|Группировка Пок упорядочить по Пок.Наименование без Групп;";

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

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

Возврат;

КонецЕсли;

ИтНачК=0;

ИтНачД=0;

ИтИзмК=0;

ИтИзмД=0;

ИтКонК=0;

ИтКонД=0;

// Это переменные для итога

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

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

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

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

Клн=Запрос.Пок;

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

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

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

ИзмД=Запрос.СумДО;

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

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

// Получаем разные сальдо и обороты...

ИтНачК=ИтНачК+НачК;

ИтНачД=ИтНачД+НачД;

ИтИзмК=ИтИзмК+ИзмК;

ИтКонД=ИтКонД+КонД;

ИтКонК=ИтКонК+КонК;

ИтИзмД=ИтИзмД+ИзмД;

// Складываем для окончательного итога

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



КонецЦикла;

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

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

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

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

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

//==========================================================

Процедура Дат(Тип)

// Процедура с переменной

Если Тип="Н" Тогда

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

ДатН=ДатК;

КонецЕсли;

ИначеЕсли Тип="К" Тогда

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

ДатК=ДатН;

КонецЕсли;

КонецЕсли;

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

//==========================================================

ДатК=ТекущаяДата();

ДатН=НачМесяца(ДатК);

В этом отчете мы воспользовались не привычным нам уже объектом БухгалтерскиеИтоги, а объектом Запрос. С ним мы активно работали в первой методичке.

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

Дополнение
Проверяем работу отчета.

2.44 Новые счета в плане счетов.

Ну, вроде и все, фирма "Magic Inc" автоматизирована. И тут некий клиент узнает, что Бегемот умеет еще и починять примусы. Этот клиент приносит пару примусов и просит их отремонтировать. Что должен сделать бухгалтер. Ну, во-первых завести счет 002 – "Товарно-материальные ценности, принятые на ответственное хранение", счет 23 – "Вспомогательные производства" и счет 71 – "Расчеты с подотчетными лицами". Заведем их в нашу конфигурацию. Эти счета субсчетов иметь не будут.

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


  • Открываем план счетов;


  • Добавляем новый счет 23, активный, субконто ВидЗатрат;


  • Добавляем новый счет 71, активно-пассивный, субконто Сотрудник;


  • Добавляем счет 002, активный, забалансовый;


  • Если мы приглядимся к списку счетов, то увидим – счета введенные в Конфигураторе имеют в пиктограмме красную галочку, а введенные в режиме Предприятия – нет.

    А тем временем Бегемот, посланный в магазин за запчастями, приносит на обрывке бумаги:
    Дополнение
    Необходимо провести это все через бухгалтерию.

    Операция №1



    Д 002 – 200 руб. Приняты в ремонт 2 примуса.

    Операция №2

    Д 71 К 50 – 100 руб. Выдано Бегемоту под отчет.

    Операция №3

    Д 10 К 71 – 71.67 руб. Приобретены Бегемотом запчасти

    Д 19.3 К 71 – 14.33 руб. НДС за приобретенные запчасти.

    Д 50 К 71 – 14.00 руб. Возвращен Бегемотом остаток из подотчетных сумм.

    Операция №4

    Д 23 К 10 – 71.67 руб. Запчасти переданы в производство

    Операция №5

    Д 23 К 70 – 3 руб. Бегемоту за работу

    Операция №6

    Д 90 К 23 – 74.67 руб. Реализованы услуги по себестоимости

    Д 90 К 99 - 25.33 руб. Прибыль

    Д 90 К 68 – 20 руб. НДС за оказанные услуги

    Д 62 К 90 – 120 руб. На заказчика зачислен долг

    Операция №7

    Д 50 К 62 – 120 руб. Получены деньги

    К 002 – 200 руб. Возвращены примусы

    Операция №8

    Д 68.1 К 19.3 – 14.37 руб. Зачтен НДС за запчасти.

    Операция №9

    Д 70 К 50 – 3 руб. Выплата Бегемоту зарплаты за починку примуса.

    Все вроде замечательно. Но бухгалтер Коровьев отбывает в долгую творческую командировку, руководить хором песни и пляски народов крайнего Юго-Запада. А примусов на починку обещали еще поднести. Бухгалтер может создать кучу корректных проводок и установить в свойствах флаг всегда проверять по ним новые проводки операций и сделать ряд типовых операций, чтобы легче и проще было вводить однотипные операции, но это совсем другая история...

    2.45 Совсем другая история.

    Эта глава напрямую не относится к программированию, но для полноты картины, думается, будет не вредной.

    Корректные проводки – это особый системный списочек проводок, которые главбух фирмы считает правильными (корректными). И ежели мы в настройках параметров системы (меню "Сервис", команда "Параметры"), на закладке "Операция" поставим галочку на настройке "Проверять проводки при записи операции", то при записи операции вводимой вручную будет выполняться контроль проводок с использованием списка корректных проводок (это я содрал из хелпа в 1С).

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



    Вместе с господином Коровьевым переходим к типовым операциям. Входим в меню "Операции", комманда "Типовые операции". Появился пустой еще пока список. Добавим в него первую запись "Выдача денег под отчет" (эта операция простая и поэтому на ее примере будет проще разобраться). Входим в режим редактирования типовой операции (меню "Действия", комманда "Редактировать"). Появилось окно конструктора типовой операции.

  • Через меню "Действие" командой "Новая проводка" введем строку для создания проводки;


  • Сразу укажем фирму – "Magic Inc";


  • Журнал – 1 (кредит 50 счета);


  • Укажем счет дебета – 70, Субконто 1 по этому счету – сотрудники фирмы, здесь мы можем сразу указать Бегемота, а можем и не указывать. Если мы его укажем, то мы можем установить флаг активизации для этого поля – Пропускать, и тогда при вводе опреации на основании типовой, нам не будет предлагаться выбрать сотрудника;


  • Укажем счет кредита – 50.1;


  • Перейдем к сумме проводки. Здесь мы воспользуемся формулой. Установив курсор на поле Сумма в строке проводки перейдем к полю Формула (при этом поле суммы проводки будет обведено синей рамкой). В поле формула пишем: СуммаОперации. Таким образом при вводе суммы операции сумма проводки будет рассчитываться автоматически.


  • Дополнение
    Если у нас много проводок, мы можем распределить между ними сумму операции по каким либо правилам. Таким же способом можно рассчитывать поле Валютной суммы.

    Ну и заполним поле комментария к проводке.

    Осталось сохранить внесенные настройки – Меню "Действия" команда "Сохранить".

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

    Зарплата

    Введение

    Компонента Расчет в системе 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, цифровой, контроль уникальности – да;


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

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

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

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

    Длина: Тип:

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

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

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




    Дополнение




    Покупатель


    Кому ушел товар


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






    Договор


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


    С.Договора






    Склад


    Откуда отгрузили товар


    С.Склады











    Дополнение


    Товар
    Товар
    С.Номенклатура
    Сорт
    Сорт товара
    С.Сорт
    Кол
    Количество в произвольной ед. измерения
    Число 8.2
    +
    Ед
    Единица измерения
    С.Единицы
    КолО
    Количество в основной ед. измерения
    Число 8.2
    +,И
    Цена
    Цена реализации
    Число 7.2
    +
    Сумма
    Сумма документа
    Число 15.2
    +,И
  • Создадим новый документ;

  • Заполняем свойства и реквизиты согласно таблицы;

  • Создаем форму документа;

  • Редактируем форму накладной по аналогии с приходной накладной;

  • Поле реквизита "НомерДок" делаем недоступным для редактирования;

  • Формулы в реквизиты диалога ставим такие же как и в приходной накладной. За исключением Поставщик(), ее заменяем на Покупатель(). И убираем процедуру из колонки "Цена", эту колонку делаем недоступной для редактирования;

  • Процедуры в модуль документа заносим из модуля формы приходной накладной. Только везде ЦенаП меняем на ЦенаР, и меняем название процедуры Поставщик() на Покупатель(), и убираем процедуру Цена();

  • Текстовые поля с итогами по колонкам таблицы можно просто скопировать из формы документа приходная накладная;

  • У нас цена реализации зависит от даты. Мы хотим, чтобы при изменении даты документа цены в строках документа соответственно менялись;
  • Добавим функцию ДатаДок() в поле реквизита "ДатаДок";

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

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

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

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

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

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

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

    Иначе

    Цена=0;

    Сумма=0;

    КонецЕсли;

    КонецЦикла;

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

    // Процедура простая и в комментариях не нуждается

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




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


  • Нажимаем [Формы списка >];


  • Выпал список. Выберем пункт "Редактировать";


  • Появилось окно редактирования списка форм списка справочника;


  • [Новый];


  • Введем идентификатор "ДляПодбора". [ОК];


  • Курсор на новой форме списка "ДляПодбора";


  • Нажмем [Для выбора];


  • Галочка во второй колонке переместилась, и встала напротив "ДляПодбора";


  • [Открыть];

    Дополнение


  • В форме списка оставим только поля "Код" и "Наименование";


  • Через меню Вставить командой "Текст" выберем элемент диалога текст для вставки;


  • Укажем ему место для вставки в табличной части. Добавилась новая колонка. В ней мы будем выводить остаток товаров на рабочую дату;


  • В свойствах этой колонки типа Текст пишем заголовок "Ост";


  • В формулу пишем функцию Ост();


  • Добавим в экранную форму поле ввода "Склад" типа С.Склады – остатки у нас будут по конкретному складу. Это поле сделаем недоступным;


  • В модуль формы списка добавим функцию:

    Функция Ост()

    ТекТовар=ТекущийЭлемент();

    // Получаем текущий товар в строке

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

    ТекущийЭлемент(),,,"Количество");

    // Получаем суммарный остаток по ресурсу "Количество"

    // по измерениям "Склад" и "Товар", по остальным измерениям суммируем

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

    Возврат("");

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

    Иначе

    Возврат(КолТов);

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

    КонецЕсли;

    КонецФункции


  • Вернемся к форме документа расходная накладная;


  • Добавим в экранную форму кнопку;


  • Заголовок у нее будет "Подбор", формула – Подбор();


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

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

    // Эта процедура запускается по нажатию кнопки [Подбор]

    ОткрытьПодбор("Номенклатура","ДляПодбора");

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



    // будем из справочника Номенклатура, используя форму списка "ДляПодбора"

    УстановитьЗначениеВПодборе("Склад",Склад);

    // В форму подбора в поле "Склад" передаем значение склада из

    // текущего документа

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

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

    Процедура ОбработкаПодбора(ВыбТов)

    // Предопределенная процедура, срабатывающая по событию – выбор

    // элемента ВыбТов из справочника

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

    ВыбТов,,,"Количество");

    // Проверим остаток

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

    Возврат;

    // если остаток на складе отсутствует, завершаем процедуру

    КонецЕсли;

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

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

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

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

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

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

    // колонки д. таблицы

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

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

    // в копии регистра остатков нас будут интересовать

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

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

    // перегрузим итоги в д. таблицу

    РегО="";

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

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

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

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

    // если есть остаток, мы его перенесем во вторую д. таблицу

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

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

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

    ТабЗн2.Остаток=Ост;

    КонецЕсли;

    КонецЦикла;

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

    // просуммируем по сортам и получим количество товара по каждому сорту



    ВыбСтрока=1;

    Если ТабЗн2.ВыбратьСтроку(ВыбСтрока,

    СокрЛП(ВыбТов.Код)+" ("

    +СокрЛП(ВыбТов.Наименование)+")")=1 Тогда

    // Выберем строку с нужным сортом

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

    // создаем в документе новую строку

    Товар=ВыбТов;

    // заполняем поле "Товар"

    СортВыб=ТабЗн2.ПолучитьЗначение(ВыбСтрока,"Сорт");

    // по выбранной строке получаем сорт

    КолОст=ТабЗн2.ПолучитьЗначение(ВыбСтрока,"Остаток");

    // и остаток

    Сорт=СортВыб;

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

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

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

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

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

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

    Прервать;

    КонецЕсли;

    КонецЦикла;

    // это уже было...

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

    КолВыб=0;

    Если ВвестиЧисло(КолВыб,СокрЛП(ВыбТов.Код)

    +"/"+СокрЛП(Строка(СортВыб)+" кол:"

    +Строка(КолОст)),8,2,0)=1 Тогда

    // Введем нужное нам количество

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

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

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

    КонецЕсли;

    Кол=КолВыб;

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

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

    КонецЕсли;

    АктивизироватьСтроку();

    // установим курсор в документе на строку, которую мы ввели

    КонецЕсли;

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


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


  • Напишем в модуль документа следующее:

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

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



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

    // Проверяем, не проводится ли документ ранее точки актуальности итогов

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

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

    КонецЕсли;

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

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

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

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

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

    Если Остат

    Сообщить("Нет товара № "

    +СокрЛП(Товар.Код)+"/"

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

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

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

    КонецЕсли;

    КонецЦикла;

    // аналогичную часть кода см. в отчете ОстаткиНаСкладе

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

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

    Возврат;

    КонецЕсли;

    // Это см. документы Приход/Расход денег

    // По регистру взаиморасчетов

    Регистр.Взаиморасчеты.Контрагент = Покупатель;

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

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

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

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

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

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

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

    Тогда

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

    ИначеЕсли

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

    Тогда



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

    КонецЕсли;

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


  • Начнем описание методик с FIFO;


  • Заместо строки "// Здесь будет записана методика списания по FIFO" напишем:

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

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

    // временная таблица

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

    // еще одна временная таблица

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

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

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

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

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

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

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

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

    // см. операцию подбора

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

    // а здесь интересно: Структура ТабЗн1 после выгрузки будет аналогична

    // структуре регистра. Реквизит "Партия" в регистре стоит на 4-ой

    // позиции, значит и колонка "Партия" – 4-ая, Колонки "Количество"

    // и "СуммаП" – соответственно 5-ая и 6-ая

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

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

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

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

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

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

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

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

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

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

    КонецЕсли;

    КонецЦикла;

    // Заполняем промежуточную таблицу

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

    // Удаляем все записи и колонки из ТабЗн1

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

    // Сортируем по документам в порядке возрастания даты (FIFO)

    // Более ранние партии вверху

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

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

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

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



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

    // определяем цену текущей партии

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

    // а вот и сама партия

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

    // требуемое количество больше, чем остатки в текущей партии,

    // здесь спишем сколько есть, а что осталось, из более поздней

    // партии

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

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

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

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

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

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

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

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

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

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

    // Про обороты не забыть!

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

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

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

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

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

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

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

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

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

    // это сколько остатков нам не хватает до полного счастья

    Иначе

    // В партии товара больше, чем мы запрашиваем.

    // Списываем сколько запрашиваем

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЕсли;

    КонецЕсли;

    КонецЦикла;

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

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

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

    КонецЦикла;

    Здесь мы воспользовались для определения партий механизмом прямой выгрузки данных из регистра в таблицу значений.


  • Теперь опишем методику списания по LIFO. Мы, конечно можем, воспользоваться предыдущим примером, заменив строку

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

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

    // Сортировка документов по убывающей. Последний – сверху

    Но мы легких путей не ищем! Воспользуемся механизмом запроса.


  • Заместо строки "// Здесь будет записана методика списания по LIFO" напишем:

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

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

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

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



    Запрос="";

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

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

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

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

    КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Возврат;

    КонецЕсли;

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

    // В методе Группировка флаг – 1 указывает, что сортировка по запросу

    // идет в порядке убывания. Более поздние документы идут первыми

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

    Прервать;

    КонецЕсли;

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

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

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

    Стоимость=Окр((Запрос.СумКонОст/Запрос.КолКонОст)*Списывать,2,1);

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

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

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

    ИначеЕсли Запрос.КолКонОст

    Списывать=Запрос.КолКонОст;

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

    КонецЕсли;

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    КонецЦикла;

    КонецЦикла;


  • Теперь опишем алгоритм списания по-среднему:

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

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

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

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

    // Получаем суммарный остаток по указанным измерениям

    // по данному ресурсу

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

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

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

    // А это, что-бы заполнить хоть чем-нибудь измерение "Партия"

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

    КонецЦикла;


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


  • Изменим содержимое графы "Кол";


  • Добавим в выбранные значения графы Документ.РасходнаяНакладная.КолО;


  • Аналогично поступим и с графой "Сумма";


  • 2.23 Расходная накладная. Продолжение.

    Документ " Расходная накладная" создан! Давайте проверим его в работе. И посмотрим, как у нас будет списываться товар при разных способах.

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


  • Способ списания – FIFO;


  • Создаем Расходную накладную №1 от 08.10.2000;


  • Укажем какого-нибудь покупателя и его договор;


  • Укажем склад №3;


  • [Подбор] (Надо-же проверить);


  • Выберем кефир, всего его 40;


  • Он есть только в 1-ом сорте в количестве 40;


  • Пусть будет 1-ый сорт 22 штуки;


  • Выберем яблоки – их 200 кг;


  • Они есть в 1-ом сорте – 100 кг. и во 2-ом – 100 кг;


  • Сперва выберем 1-ый сорт – 55 кг.;


  • А затем снова яблоки, но уже 2-ой сорт – 55 кг.;


  • Закроем окно подбора;


  • [ОК]. Сохраним и проведем документ;


  • Смотрим движения документа;


  • Регистр "Взаиморасчеты" – ничего необычного;


  • Регистр "ОстаткиТоваров" – как и требовалось, в первую очередь товар списывался с более ранней накладной по ее цене прихода;


  • Регистр "ОборотыТоваров" – в соответствии со списываемыми партиями;


  • Метод FIFO – все в порядке;


  • Распроведем приходную накладную №1;


  • Установим в константе способ списания – LIFO;


  • Вернемся к накладной и проведем ее;


  • Смотрим движения;


  • И здесь все правильно;


  • Распроведем приходную накладную №1;


  • Установим в константе способ списания – По-среднему;




  • Вернемся к накладной и проведем ее;


  • Смотрим движения;


  • Никаких партий и суммы взяты с учетом средней цены остатка;


  • Все три основных способа списания реализованы правильно. (Есть еще способ учета "по-среднему с переоценками", он хорош тем, что при нем не накапливаются потерянные копейки как при обычном методе "по-среднему", но он сложен для реализации и встречается реже. Мы его не рассматриваем);


  • Попробуйте еще, для эксперимента, списать товара больше, чем есть на складе;


  • 2.24 Накладная на перемещение.

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

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

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

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

    Длина: Тип:

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

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

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




    Дополнение




    СкладО


    Склад отправитель


    С.Склады






    СкладП


    Склад получатель


    С.Склады











    Дополнение


    Товар
    Товар
    С.Номенклатура
    Сорт
    Сорт товара
    С.Сорт
    Кол
    Количество в произвольной ед. измерения
    Число 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 Новые интерфейсы.

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

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


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


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


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


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


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


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


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


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


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


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


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


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

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


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


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


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


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


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


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


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


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

    Введение




    Дополнение




    Сумма




    Число 10.2


    3, +









    Дополнение


    Создаем форму документа. Поля АвторДокумента и Курс сделаем недоступными. В полях валюта и ДатаКурса в формуле укажем процедуру Валюта().

    Разместим реквизиты формы документа в более-менее приемлемом виде.

    Дополнение


    В модуле формы напишем:

    Перем СтВалюта;

    Перем СтДатаКурса;

    Перем СтКурс;

    //Переменные для пересчета суммы при изменении валюты документа

    //==========================================================

    Процедура ВводНового()

    АвторДокумента=СокрЛП(ИмяПользователя());

    ФирмаДокумента=Константа.ОснФирма;

    Валюта=Константа.ОснВалюта;

    ДатаКурса=ДатаДок;

    Курс=1;

    // Заполняем значения по умолчанию

    СтВалюта=Валюта;

    СтДатаКурса=ДатаКурса;

    СтКурс=Курс;

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

    //==========================================================

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

    СтВалюта=Валюта;

    СтДатаКурса=ДатаКурса;

    СтКурс=Курс;

    ПриЗаписиПерепроводить(1);

    // При записи изменений перепроводить обязательно

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

    //==========================================================

    Процедура Валюта()

    КурсС=СтКурс;

    КратС=СтВалюта.Кратность;

    КурсН=Валюта.Курс.Получить(ДатаКурса);

    КратН=Валюта.Кратность;

    Коэфф=Окр((КурсС*КратН)/(КурсН*КратС),6,1);

    // Переводим в валюту документа

    Курс=КурсН;

    Сумма=Окр(Сумма*Коэфф,2,1);

    // Пересчитываем сумму

    СтВалюта=Валюта;

    СтДатаКурса=ДатаКурса;

    СтКурс=Курс;

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

    Перейдем к модулю документа. Учет мы будем вести в базовой валюте. Здесь мы напишем самый наипростейший вариант модуля проведения. В данном случае нам надо только перевести сумму с одного счета на другой одной проводкой. Напишем процедуру проведения:

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

    КурсД=Курс;

    КратД=Валюта.Кратность;

    КурсУ=Константа.ОснВалюта.Курс.Получить(ДатаДок);

    КратУ=Константа.ОснВалюта.Кратность;

    Коэфф=Окр((КурсД*КратУ)/(КурсУ*КратД),6,1); // переводим в валюту документа




    СуммаО=Окр(Сумма*Коэфф,2,1);

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

    ПривязыватьСтроку(0);

    // Следующая за этой командой новая проводка к строке документа не

    // привязывается

    Операция.НоваяПроводка();

    // Создаем проводку (простую) по операции

    Операция.Дебет.Счет = СчетПоКоду("68.1",ПланыСчетов.Наш);

    Операция.Кредит.Счет = СчетПоКоду("19.3",ПланыСчетов.Наш);

    // Указали корреспонденцию проводки

    Операция.Сумма = СуммаО;

    // Сумма проводки

    Операция.Фирма = ФирмаДокумента;

    Операция.Комментарий = "Учет НДС за приобретенные комплектующие";

    Операция.НомерЖурнала = " ";

    // Дополнительные сведения по проводке

    Операция.Содержание = "Учет НДС";

    Операция.СуммаОперации = СуммаО;

    Операция.Автор = СокрЛП(ИмяПользователя());

    // Дополнительные сведения по операции

    Операция.Записать();

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

    2.32 Работа с документом УчетНДС.

    Документ создан. Давайте его проверим. Входим в 1С:Предприятие и создаем новый документ "Учет НДС" на сумму 1000 тугриков (для примера), затем меняем валюту на рубли и получаем 22.77 рубля (при курсе 22.77 руб. за 1000 тугриков) все сходится, вернем тугрики. Сохраним и проведем документ. Смотрим журнал операций (Меню Действия команда "Перейти в журнал операций"). Сумма операции 22.77 (при сумме документа 1000) – верно. Проверяем проводку – тоже все верно. Документ написан правильно. Удалим этот документ, чтобы не мешал.

    2.33 Документ ПриходнаяНакладная.

    По приходной накладной мы будем получать комплектующие от поставщиков. Проводка по этому документу сложнее (Д 10.2 – К 60, Д 19.3 – К 60). В данном документе нас интересует следующее: кто поставил нам комплектующие, на какой склад мы их приняли, что конкретно пришло, в каком количестве, по какой цене без НДС, на какую сумму. Сведем все в таблицу:

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

    Журнал: ПриходныеНакладные

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

    Длина: 5 Тип: число

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

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

    Проводить: да

    Автоматическое удаление движений: да

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

    Бухгалтерский учет: да

    Расчет: нет

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

    Создавать операцию: Всегда Редактировать операцию: нет




    Дополнение


    Товар
    Товар
    С.Номенклатура
    СтЦенаП
    Старая цена прихода
    Число 7.2
    ЦенаП
    Новая цена прихода
    Число 7.2
    СтЦенаР
    Старая цена расхода
    Число 7.2
    ЦенаР
    Новая цена расхода
    Число 7.2
  • Новый документ;

  • Идентификатор – "ИзменениеЦен", Синоним – "Изменение цен", Комментарий – "изменение цен товара";

  • Документ будет проводиться и перепроводиться;

  • Новый журнал – "ИзменениеЦен";

  • В окне свойств документа заполним позиции согласно таблицы;

  • Создадим форму документа;

  • Графы "СтЦенаП" и "СтЦенаР" – сделаем недоступными;

  • На поле ввода "Товар" повесим формулу ВыбТовар();

  • На поле ввода "ЦенаП" повесим формулу ЦенаП();

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

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

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

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

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

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

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

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

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

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

    ЦенаР=Окр(ЦенаП*(1+(Константа.ПроцентНаценки/100)),2,1);

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

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

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

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

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

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

    УстановитьРеквизитСправочника(Товар,"ЦенаП",ЦенаП);

    УстановитьРеквизитСправочника(Товар,"ЦенаР",ЦенаР);

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

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

    КонецЦикла;

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

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

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

  • Введем новый документ "Изменение цен" №1 от 04.10.2000;

  • В многострочную часть занесем товар "МПР-0342" (Кефир);

  • Укажем ему новую цену поступления – 6.50;

  • Цена реализации изменилась, и составила теперь – 8.78;




  • Подтвердим, что это нас устраивает нажатием на Enter, если нет, то можно отредактировать эту цену;


  • Заведем еще один товар – "ФРЯ-908" (Яблоки);


  • Новая цена поступления – 18, цена реализации – 25;


  • [ОК]. Проведем документ;


  • Откроем журнал ИзменениеЦен. Мы журнал не редактировали, таким он выглядит в 1С по умолчанию. Если будет желание, можете поэкспериментировать с изменением внешнего вида этого журнала в Конфигураторе;


  • Документ с галочкой. Галочка сиреневого цвета – документ проведен, но он не документ оперативного учета;


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


  • Он не изменял регистров, а внес изменения в реквизиты справочников;


  • Мы видим четыре строки. Пиктограммки показывают, что это изменение периодического реквизита. Указано в каком справочнике, какой реквизит, у какого элемента, когда принял новое значение;


  • Откроем теперь справочник "Номенклатура";


  • Найдем позицию "Кефир";


  • Меню Действия команда "История значения". Выберем "ЦенаП";


  • Мы видим, когда как менялась цена поступления этого товара;

    Дополнение


  • Первая строчка с изображением руки – мы ввели цену вручную, при создании этого товара;


  • Вторая строка – листик с галочкой – мы изменили цену документом;

    Ручное изменение цены никогда не имеет времени. Оно всегда располагается в самом начале дня. Изменение цены документом отслеживает время документа. Оно может располагаться в начале, середине либо конце дня, как было указано при сохранении документа. Если в течении дня было несколько таких документов, они расположатся в зависимости от указанного в них времени.


  • Закроем 1С:Предприятие;


  • 2.18 Регистры по товарам.

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



    Регистр "ОстаткиТоваров" будет содержать информацию: где хранится/ хранился товар, что хранилось, какого сорта. Следовательно, у нас будут измерения "Склад", "Товар", "Сорт". В задании сказано, что списание товара может идти либо по LIFO, либо по FIFO, либо по среднему. Для первых двух вариантов нам надо хранить еще информацию – когда этот товар поступил на склад. Удобнее всего будет завести еще одно измерение – "Партия" – типа документ прихода товара ("ПриходнаяНакладная"). В документе хранятся дата и время, и можно без труда отсортировать их по порядку постановки на учет. Ресурсы регистра – то, что хранит регистр. Нас будет интересовать во-первых, количество товара в основной единице измерения товара, во-вторых его сумма по цене поступления – цена учета, и в-третьих сумма по цене документа – для определения полученного навара. Ценой документа в случае приходной накладной и накладной на перемещение будет цена поставки, а в случае расходной накладной – цена реализации. Реквизит у нас будет один – "ФлагДвижения" тип Число 1.0. В нем мы будем отражать характер движения, он будет равен 1 при движении Контрагент-Склад/Склад-Контрагент, и 2 при движении Склад-Склад. Движения по регистру у нас будут – приход для прихода товара на склад и расход для расхода товара со склада. Данные по регистру сведем в таблицу:

    Идентификатор: ОстаткиТоваров

    Тип: Остатки

    Периодичность: -




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




    Склад


    Место хранения


    С.Склады






    Товар


    Товар


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






    Сорт


    Сорт


    С.Сорт






    Партия


    Партия прихода товара


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












    Количество


    Количество товара


    Число 17.2






    СуммаП


    Сумма по цене поступления


    Число 19.2






    СуммаД


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


    Число 19.2












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


    Характер движения


    Число 1.0


    +


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






    Идентификатор: ОборотыТоваров

    Тип: Обороты

    Периодичность: - месяц






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




    Склад


    Место хранения


    С.Склады






    Товар


    Товар


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






    Сорт


    Сорт


    С.Сорт












    Количество


    Количество товара


    Число 17.2






    СуммаУ


    Сумма по цене учета


    Число 19.2












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


    Характер движения


    Число 1.0


    +


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






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

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

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

    Длина: 5 Тип: число

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

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

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






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


    Контрагент
    с кем мы ведем дела
    С.Контрагенты
    Д
    Договор
    по какому договору
    С.Договора
    Д, И



    Сумма
    Сумма долга
    Число 15.2



    ФлагДвижения
    тип движения
    Число 1.0
    +
    Здесь:

    Д – отбор движений;

    И – отбор итогов;

    + - не отрицательный;
    Движения по регистру будут следующие:

    Приход – приход к нам товара (общей суммой) либо денег;

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

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

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

  • Устанавливаем курсор на раздел "Общие реквизиты";

  • Вводим новый общий реквизит;

  • Идентификатор – "Комментарий", тип – Строка, длина – 100;

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

  • Вводим новый документ;




  • Идентификатор – "ПриходДенег", Синоним – "Приход денег", Комментарий – "приход денег от контрагента";


  • Документ будет проводиться – да, при записи документ будет перепроводиться – да;

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


  • Документ будет принадлежать журналу – да, Создать новый журнал – "ДвижениеДенег";

    Журнал – список документов определенного/определенных видов. Имеет экранную форму.


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


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


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


  • Нумератор – не назначен, Периодичность – год;

    Периодичность – это как часто будет появляться документ с номером 1.


  • Автоматическая нумерация строк – нет (у нас строк не будет);


  • Оперативный учет – ДА;

    Этим мы покажем, что движение осуществляется по регистрам.


  • Создадим форму документа;


  • Вставим поле с текстом, где мы укажем название документа;


  • Расставим элементы экранной формы документа поудобнее;


  • В свойствах поля договор на закладке "Дополнительно" в поле "связан с" пишем "Контрагент";

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


    Справочник "Договора" у нас подчиненный, и мы в форме документа указываем, что договора мы будем брать, принадлежащие ранее указанному контрагенту.


  • Мы желаем, чтобы при выборе другого контрагента, поле договор очищалось;


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




  • В модуле формы пишем следующую процедуру:

    Перем СтКонтрагент;

    // Это мы добавили переменную, область действия которой

    // весь модуль формы документа

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

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

    // Это предопределенная процедура, запускается при возникновении

    // события – открытие формы документа

    // Она сформировалась автоматически, как мы указали в визарде создания

    // документов

    ПриЗаписиПерепроводить(1);

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

    // попытке его сохранения программа попытается его перепровести

    СтКонтрагент=Контрагент;

    // Инициализируем переменную СтКонтрагент значением реквизита Контрагент

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

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

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

    Если Контрагент<>СтКонтрагент Тогда

    // В поле Контрагент содержимое изменилось

    Договор="";

    // Очищаем поле Договор

    СтКонтрагент=Контрагент;

    // Инициализируем переменную СтКонтрагент новым значением

    // реквизита Контрагент

    КонецЕсли;

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


  • Закроем форму;


  • Откроем Модуль документа;


  • Мы видим текст:

    // ********************

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

    //Здесь следует написать алгоритм проведения документа

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

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


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

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

    // Предопределенная процедура, запускающая механизмы регистрации движений

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

    // Выбран() – метод, возвращающий состояние поля ввода = 1, если поле

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

    Предупреждение("Контрагент не выбран");

    // Вызовем на экран информационное окно с сообщением

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

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

    КонецЕсли;

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

    Предупреждение("Договор не выбран");



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

    КонецЕсли;

    Если Договор.ДатаДоговора>ДатаДок Тогда

    // Договор еще не был заключен на дату документа

    Предупреждение("Неверная дата договора");

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

    КонецЕсли;

    // Теперь будем заполнять поля регистра "Взаиморасчеты"

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

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

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

    // Движение – поступление денег за продаваемый нами товар

    // ФлагДвижения = 4

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

    // Наш долг возрос, либо долг контрагента уменьшился – на регистр

    // пишем сумму приходом

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

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


  • Закрываем модуль документа;


  • Закроем окно свойств документа;


  • Переходим к редактированию журнала. Находим журнал "ДвижениеДенег";


  • Входим в редактирование журнала;


  • Добавим новую графу;


  • Идентификатор – "Сумма";


  • В возможных значениях отметим Документ.ПриходДенег.Шапка.Сумма;


  • В выбранных значениях появилось указание на поле документа "Приход денег" "Сумма";


  • Входим в форму списка журнала;


  • Разместим графы журнала как будет удобнее, и поменяем им ширину, чтобы все было видно;


  • Закроем форму списка журнала и окно свойств журнала;


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


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

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

  • Открываем 1С:Предприятие в монопольном режиме;


  • Через меню "Операции" команда "Управление оперативными итогами";


  • Ставим дату актуальности итогов на 01.10.2000;


  • Нажимаем [Установить];


  • Появился вопрос "Изменить Точку Актуальности итогов";


  • Отвечаем [Да];


  • Нам сообщают, что изменение точки актуальности завершено. Подтверждаем получение сообщения (подробнее см. "Руководство пользователя");


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


  • Из нового раздела меню "Документы" вызываем документ приход денег;




  • Номер документа – 1, Дата – 02.10.2000, Комментарий – "наш первый документ", Контрагент – "Винни-Пух и все все все", Договор – "№12 от 2 Октября 2000 г.", Сумма – 1000;


  • [Закрыть];


  • Нас спросят – сохранить ли документ? [Да];


  • Попросят указать время – в начало дня;


  • Входим в меню "Журналы". Выберем журнал "ДвижениеДенег";


  • Если мы в журнале ничего не видим, значит, у нас стоит не тот период просмотра журнала. Входим в меню Действия, команда "Интервал". Устанавливаем диапазон дат от 01.10.2000 до текущей даты;


  • Мы видим наш документ. Пиктограммка слева – голубенький листок бумажки. Это значит, что документ сохранен;


  • Откроем этот документ, дважды щелкнув его мышкой;


  • Теперь нажмем [ОК];


  • Нас спросят про сохранение документа – [Да];


  • Провести документ? – [Да];


  • Точка актуальности будет перенесена на новую дату. Продолжить? – [Да];

    Нами точка Актуальности была выставлена на 01.10.2000, а документ от 02.10.2000 – точка актуальности перемещается на последний проведенный документ.


  • В журнале пиктограммка приобрела красную галочку – флаг проведения документа, и красную черточку внизу – признак того, что ТА (Точка Актуальности стоит на текущем документе);


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


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

    Тут есть еще строчка – Реквизиты справочников. Документ при проведении может менять значения периодических реквизитов справочников! (Если, конечно, это прописать в процедуре ОбработкаПроведения).


  • Выбираем эту строку;


  • Появилось окно "Движения регистров Взаиморасчеты (Приход денег 1 (02.10.2000))";


  • Видим в списке движений одну строку со знаком плюс (+) – это был приход. Движение было только одно – как мы и написали;


  • Закроем 1С:Предприятие;


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

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



  • В дереве метаданных, в разделе отчеты, создаем новый отчет;


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


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


  • Конструкторы никакие вызывать не будем – так напишем (либо скопируем с сей методички);


  • Появилась экранная форма отчета;


  • Добавим поле ввода. Идентификатор – ВыбДата, тип – дата;


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

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

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

    // Запрос – специальный объект в 1С, служит для получения структурированной

    // выборки данных

    ТЗ="

    |Период с ВыбДата по ВыбДата;

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

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

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

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

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

    |";

    // Это текст запроса. Подробности в "Описании языка" том 2

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

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

    Возврат;

    КонецЕсли;

    // Если запрос будет не выполнен по какой либо причине, метод Выполнить()

    // вернет 0. Мы сообщим пользователю о произошедшей ошибке, и

    // командой Возврат – прервем выполнение процедуры

    ИтогоМы=0;

    ИтогоНам=0;

    // В этих двух переменных мы будем хранить итоговую информацию по долгу

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

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

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

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

    // Получаем очередную запись из запроса

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

    // Во временную переменную передаем значение выборки

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

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

    // Дальше уже все знакомые нам методы

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

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

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

    ИначеЕсли Долг>0 Тогда



    Мы=Долг;

    Нам=0;

    ИначеЕсли Долг<0 Тогда

    Мы=0;

    Нам=-Долг;

    КонецЕсли;

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

    Иначе

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

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

    Продолжить;

    ИначеЕсли Долг>0 Тогда

    Мы=Долг;

    Нам=0;

    ИтогоМы=ИтогоМы+Мы;

    ИначеЕсли Долг<0 Тогда

    Мы=0;

    Нам=-Долг;

    ИтогоНам=ИтогоНам+Нам;

    КонецЕсли;

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

    КонецЕсли;

    КонецЦикла;

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

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

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

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

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


  • Перейдем на закладку таблица, создадим шаблон, такого вида:

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


  • Закроем форму отчета;


  • Теперь будем включать наш отчет в меню. В окне метаданных перейдем на закладку "Интерфейсы";


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


  • Входим в редактирование строки "новая колонка...";

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


  • Название пишем "Отчеты";


  • [ОК];


  • Открываем появившийся раздел меню "Отчеты";


  • Открываем подраздел меню "новый...";

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


  • Выбираем объект – Отчеты.Взаиморасчеты;


  • Поля Название, Подсказка заполнились автоматически. Их можно поменять;


  • [ОК];


  • Меню Действия команда "Тест" вызовет окошко, где будет показано, как будет выглядеть наше меню;


  • Закрываем тестовое окно;


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


  • Возвращаемся к дереву метаданных;


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


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




  • Через меню Отчеты вызываем наш отчет "Взаиморасчеты";


  • Устанавливаем дату 02.10.2000;


  • Нажимаем [Сформировать];


  • Результат. Мы должны всем поставщикам 1000, из них Винни-Пуху 1000, а всего наш долг 1000. Что и требовалось;


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

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

  • В дереве метаданных скопируем документ "ПриходДенег" в буфер обмена Windows;


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


  • Изменим Идентификатор на "ВыплатаДенег", аналогично изменим Синоним и комментарий;


  • Внесем соответствующие косметические изменения в форму документа;


  • В модуле проведения документа вместо строки:

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

    напишем

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


  • В модуле проведения документа вместо строки:

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

    напишем

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


  • В журнале "ДвижениеДенег" изменим реквизит "Сумма";


  • В выбранные значения добавим реквизит "Сумма" из нового документа;


  • Перейдем на закладку "Интерфейсы" и добавим в меню в раздел "Документы" наш документ "ВыплатаДенег";


  • Команду укажем – Документы.ВыплатаДенег.Ввести;


  • Закроем лишние окна;


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


  • Откроем 1С:Предприятие;


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


  • Глава 6

    2.17 Документ "Изменение цен".

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



    В справочнике "Номенклатура" мы имеем два реквизита интересующего нас типа: "ЦенаП" и "ЦенаР". В их свойствах мы указали, что они могут изменяться документами. Спроектируем такой документ.

    Пусть наш документ будет иметь возможность изменять цену не одного товара, а любого количества. Значит наш документ будет содержать многострочную часть. Документ должен иметь возможность изменять сразу и цену поступления и цену реализации. При работе с ценами товара мы хотим видеть, какие цены были до изменения. Эти поля должны быть не редактируемые. Для документа будет заведен отдельный журнал. Создадим этот документ. Все данные по документу сведем в таблицу:

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

    Журнал: ИзменениеЦен

    Нумератор: Нет

    Периодичность: Год

    Длина: 5

    Тип: число

    Уникальность: да

    Автонумерация: да

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

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




    Дополнительные функции


    Вам предлагается самостоятельно реализовать следующие дополнительные функции:
  • Поиск нужной книги по названию, автору, жанру и другим известным признакам.

  • Технология штрих-кодирования. Каждому читателю и каждой книге присваивается уникальный штрих-код. В экранных формах выбор читателя производится путем считывания штрих-кода, программа должна найти читателя или книгу в справочнике по штрих-коду.

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

  • Отмена документов. При отмене проведения документов все изменения, которые он сделал в системе должны быть также отменены. Для сохранения непротиворечивости базы данных отмена документов должна проводиться в обратном порядке для каждого читателя и книги.

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

  • Добавьте другие функции, которые вы считаете просто необходимыми для работы нормальной библиотеки.

  • Доставочка




    Дополнительные функции


    Вам предлагается самостоятельно реализовать следующие дополнительные функции:
  • Единицы измерения для каждого материала. У материала есть основная единица измерения (выбирается из справочника ЕдиницыИзмерения), в которых хранятся остатки в регистре. При приходовании и расходовании материала пользователь может указать любую единицу измерения, допустимую для данного материала (выбирается из подчиненного справочника ЕдИзмМатериалов). Программа пересчитывает указанное количество в основную единицу измерения с использованием коэффициента пересчета из справочника ЕдИзмМатериалов. В отчет добавляется новая колонка "Ед. изм."

  • Учет денежного выражения. В регистр Материалы добавляется новый ресурс СуммаРуб. (название Сумма не рекомендуется, так как есть встроенная функция Сумма в языке запросов). В отчете выводятся две колонки: Количество и Сумма. Должна быть возможность выводить только одну колонку по требованию пользователя. По колонке Сумма должны выводиться итоги по каждой группе материалов и по всему отчету.

  • Отчет о движении материалов за период.
    Пользователь в диалоге указывает период. В отчете выводятся колонки: Материал, Остаток на начало период, Приход за период, Расход за период, Остаток на конец периода. Для ускорения работы отчета на больших базах можно создать оборотный регистр ДвижениеМатериалов, тогда каждый документ должен делать движения по двум регистрам.

  • Партионный учет. Списание материалов по средней себестоимости / по методу FIFO / LIFO. В регистр добавляется новое измерение Партия (типа Документ). При расходовании материала подсчитывается сумма списания по заданному методу. Метод задается пользователем в константе МетодСписанияМатериалов (выбирается из перечисления МетодыСписанияМатериалов).

  • Работенка




    Другие методы


    Метод ОсновныеИтоги
    переводит объект в режим работы с основными итогами. Вызов этого метода имеет смысл тогда, когда был выполнен расчет временных итогов или запрос, и нужно вернуть объект к работе с основными итогами. При этом результаты запроса или расчета временных итогов теряются.
    Для переключения в режим работы с временными итогами следует выполнить метод Рассчитать. После этого объект позволяет получать остатки и обороты по счетам за произвольный период, заданный при вызове метода Рассчитать.
    Для получения временных итогов используются те же методы, что и для получения основных итогов (СНД, СНК , СКД , СКК, ДО, КО, ОБ и другие). Параметры метода Рассчитать определяют итоги, которые будут доступны для получения этими методами.




    Другие полезные методы


    Некоторые методы уже применялись в примерах, а теперь сведем их в таблицу:








    Два вспомогательных метода диаграммы


    Запрет перерисовки может ускорить работу системы во время наполнения таблицы данными.
    Диаграмма1.Обновление(0);

    //то же выражение, но с флагом 1 разрешит перерисовку
    Очистка всех установленных значений имен и количеств точек, серий, диаграммы делается так:
    Диаграмма1.Очистить();




    Двойная группировка


    Этот запрос совершает очень полезную работу: он группирует всех сотрудников по должностям. Заметьте, что сначала идет группировка по должности, а затем по сотруднику, это очень важно. Обратите внимание на переменную запроса Сотр. Она ссылается на строку справочника Сотрудники. Чтобы вывести ФИО сотрудника используется обращение к атрибуту объекта: Сотр.Наименование.
    Запрос = СоздатьОбъект("Запрос");

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

    |Сотр = Справочник.Сотрудники.ТекущийЭлемент;

    |Долж = Справочник.Сотрудники.Должность;

    |Группировка Долж упорядочить по Долж.Наименование;

    |Группировка Сотр упорядочить по Сотр.Наименование;

    |";

    Запрос.Выполнить(ТекстЗапроса);

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

    ............Сообщить(Запрос.Долж);

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

    ................Сообщить("......" + Запрос.Сотр.Наименование);

    ............КонецЦикла;

    КонецЦикла;




    Если из регистра нужно быстро


    Регистры остатков
    Рассмотрим в качестве примера отслеживание взаиморасчетов с покупателями товаров, которые производит или продает предприятие.
    Для того чтобы оперативно получать информацию о взаимной задолженности предприятия и покупателя, потребуется регистр «Взаиморасчеты», в котором для каждого покупателя будет храниться сумма задолженности. При совершении хозяйственной операции состояние регистра будет соответствующим образом изменяться, каждый раз отражая текущее состояние взаиморасчетов. Регистр «Взаиморасчеты» — это регистр остатков.
    Регистры оборотов
    Однако, легко получить информацию об объеме закупок, совершенных данным покупателем за какой-либо период времени, из регистра «Взаиморасчеты» нельзя. Можно проанализировать все движения, имеющие отношение к данному покупателю, и вычислить общую сумму закупок. Но, когда необходимо получать эти сведения оперативно (например, по условиям договора при достижении определенного объема закупок покупателю должна предоставляться скидка), такой способ, конечно же, не подходит.
    В этом случае решением проблемы может быть использование регистра оборотов. В таком регистре — назовем его «Объем закупок» — в разрезе покупателей будет храниться информация об объеме закупок (об обороте покупателя). При создании регистра оборотов можно указывать, с какой периодичностью будет накапливаться информация: день, неделя, месяц и так далее.
    Теперь, при совершении хозяйственных операций, необходимо будет изменять не только состояние регистра «Взаиморасчеты», но и регистр «Объем закупок». В этот регистр при совершении клиентом каждой покупки будет заноситься информация о сумме покупки. В результате в регистре «Объем закупок» будет постоянно накапливаться информация об общем объеме закупок клиента.




    Фильтрация движений и итогов


    РегТовары = СоздатьОбъект("Регистр.Товары");
    1. Метод УстановитьФильтр

    Пример:

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

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

    РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);

    Пока РегТовары.ПолучитьДвижение()=1 Цикл

    ...

    КонецЦикла;

    //выбрать все товары на данном складе

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

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

    Пока РегТовары.ПолучитьИтог()=1 Цикл

    ...

    КонецЦикла;

    2. Метод УстановитьЗначениеФильтра



    Пример:

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

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

    //далее идет выборка движений или итогов
    3. Метод ВыбратьДвиженияДокумента



    4. Метод ВыбратьДвиженияСОстатками

    Применяется только для регистра остатков.




    Фильтрация (отбор)


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

    РежимИерархии = 1; //1- выбирать с учетом иерархии, 0 - без учета

    РежимГрупп = 0; //0 - не включать в выборку группы, 1 - включать

    ИмяРеквизита = "Год"; //в Конфигураторе у реквизита должен быть установлен флажок Отбор

    Значение = 1980;

    СпрСотр.ВыбратьЭлементыПоРеквизиту(ИмяРеквизита,Значение,РежимИерархии, РежимГрупп);

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

    .....<действия с очередным элементом>

    КонецЦикла;




    Фильтрация по графе отбора


    синтаксис: ВыбратьПоЗначению (<НачалоПериода>, <КонецПериода> , <ВидОтбора>, <3начениеОтбора>)
    Параметр <ВидОтбора> для отбора операций может принимать следующие значения:














    "СуммаОперации"

    Отбор по сумме операции. Доступно если в метаданных включен отбор по сумме операции.

    "Содержание"

    Отбор по содержанию операции. Доступно если в метаданных включен отбор по содержанию операции.

    <РеквизитОперации>

    Отбор по дополнительному реквизиту операции. Идентификатор реквизита должен быть указан так, как это задано в метаданных. Доступно если в метаданных включен отбор по реквизиту операции.

    Параметр <ВидОтбора> для отбора проводок может принимать следующие значения:


























    "Счет"

    Отбор по счету дебета или счету кредита проводки. Доступно если в метаданных включен отбор по счетам проводок.

    "СчетДт"

    Отбор по счету дебета проводки. Доступно если в метаданных включен отбор по дебету/кредиту счетов проводок.

    "СчетКт"

    Отбор по счету кредита проводки. Доступно если в метаданных включен отбор по дебету/кредиту счетов проводок.

    "Валюта"

    Отбор по валюте проводки. Доступно если в метаданных включен отбор по валюте проводок.

    ВидСубконто>

    Отбор по виду субконто. Идентификатор вида субконто должен быть указан так, как он задан в метаданных. Доступно если в метаданных включен отбор по этому виду субконто.

    <РеквизитПроводки>

    Отбор по дополнительному реквизиту проводки. Идентификатор реквизита должен быть указан так, как он задан в метаданных. Доступно если в метаданных включен отбор по этому реквизиту проводки

    После выполнения данного метода обход операций (проводок) осуществляется методами ПолучитьОперацию и ПолучитьПроводку.




    Фильтрация по субконто


    Пример, выбрать все проводки по счету 60 для заданной организации
    Опер = СоздатьОбъект("Операция");

    Опер.ИспользоватьСубконто(ВидыСубконто.Организации, ВыбОрг);

    Опер.ВыбратьОперацииСПроводками(ДатаНач, ДатаКон, "60");

    Пока Опер.ПолучитьПроводку() = 1 Цикл

    .....Сообщить("Сумма " + Опер.Сумма);

    КонецЦикла;
    Пример, выбрать все проводки по счету 10 для заданного материала и заданного склада
    Опер = СоздатьОбъект("Операция");

    Опер.ИспользоватьСубконто(ВидыСубконто.Материалы, ВыбрМатериал);

    Опер.ИспользоватьСубконто(ВидыСубконто.Склады, ВыбрСклад);

    Опер.ВыбратьОперацииСПроводками(ДатаНач, ДатаКон, "10");

    Пока Опер.ПолучитьПроводку() = 1 Цикл

    .....Сообщить("Сумма " + Опер.Сумма);

    КонецЦикла;
    Метод ИспользоватьКорСубконто аналогичен методу ИспользоватьСубконто, но задает фильтр по корреспондирующим субконто.
    В качестве значения субконто в этим методы можно передавать «Список значений».




    Фильтрация в цикле


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

    СпрСотр.ИспользоватьРодителя(грпРаботающие);

    СпрСотр.ИспользоватьДату(РабочаяДата());

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

    Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
    Если СпрСотр.Должность <> длжПлотник Тогда

    ....Продолжить; //этого сотрудника пропускаем, перейти в начало цикла

    КонецЕсли;
    <действия с очередным элементом>
    КонецЦикла;




    ФИО


    2.4 Справочник фирм.
    Мы будем моделировать часть бухгалтерского учета. Учет обычно ведется где-то, а не вообще. Создадим наш субъект бухгалтерского учета. Предприятие может, в принципе, иметь филиалы, с отдельным бухучетом, или вообще представлять собой корпорацию. Для нашего предприятия и его филиалов создадим справочник фирм. Он будет у нас одноуровневым, и содержать, кроме названия фирмы, ее адрес, ФИО руководителя и ФИО главного бухгалтера.
    66601
    Воланд
    66602
    Коровьев Фагот
    66603
    Азазелло
    66604
    Бегемот
    66605
    Гелла

    Идентификатор: Фирмы

    Подчинен: нет

    Количество уровней: 1

    Код: 5 Тип кода: число Серии кодов: подчинение

    Наименование: 50

    Основное представление: наименование

    Группы сверху: да

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

    Одна форма для элемента и группы?: нет

    Редактировать: в диалоге

    "Код" – номер фирмы по порядку.

    "Наименование" – полное название фирмы.
    Реквизит
    Описание
    ТипЗначения
    Доп.
    Исп.
    Изм.
    Адрес
    Юридический адрес фирмы
    Строка неогр.
    ФИОРук
    ФИО руководителя
    С.Сотрудники
    ФИОБух
    ФИО главного бухгалтера
    С.Сотрудники

    ФИО
    Создаем новый справочник;
  • Создаем форму элемента;

  • Поле "Код" сделаем недоступным, оно и так формируется автоматически;

  • Поле "Адрес" сделаем многострочным;

  • Теперь создадим форму списка;

  • Для указания, какая из фирм – основная, создадим Константу "ОснФирма", типа С.Фирмы;

  • Перейдем в 1С:Предприятие и заполним реквизиты нашей фирмы:

    Наименование: "Magic Inc."

    ФИО руководителя: "Воланд"

    ФИО главбуха: "Коровьев Фагот"

    Адрес: "Россия РФ г.Москва ул.Садовая д.302-бис кв.50". (Азазелло – в охранники, Геллу в секретарши, Бегемота в рабочие, он хорошо примусы починяет).

  • Укажем в константах эту фирму как основную;

  • 2.5 Справочник валют.
    Бухгалтера обычно что-нибудь считают, особенно любят они считать деньги. Поможем им, создадим справочник со списком валют. Валюта кроме названия имеет такие характеристики как курс и кратность. Первая показывает ее отношение к другой валюте, принятой за основную а вторая сколько единиц первой валюты указывается при назначении курса. (Пример 1000 итальянских лир соответствует 13.5 рублям, курс (если рубль – базовая валюта) – 13.5, кратность - 1000). Курс у нас будет периодическим значением. Изменять его мы будем вручную. Кроме справочника создадим и Константу с базовой валютой учета

    Идентификатор: Валюты

    Подчинен: нет

    Количество уровней: 1

    Код: 3 Тип кода: строка Серии кодов: подчинение

    Наименование: 50

    Основное представление: код

    Группы сверху: да

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

    Одна форма для элемента и группы?: нет

    Редактировать: в диалоге

    "Код" – шифр валюты по ОКВ (Общероссийский классификатор валют).

    "Наименование" – полное название валюты.
    Реквизит
    Описание
    ТипЗначения
    Доп.
    Исп.
    Изм.
    Курс
    курс валюты
    Число 6.2
    +, П
    Р
    Кратность
    кратность валюты
    Число 6.0
    +



    ФИО
    Создаем новый справочник:

  • Создаем форму элемента;


  • В форму элемента добавим текст с формулой Константа.ОснВалюта.Код;


  • Теперь создадим форму списка;


  • Заведем новую Константу – "ОснВалюта", типа С.Валюты;


  • Заполняем справочник валют;


  • Введем наш российский рубль (в нем мы и будем для простоты вести все расчеты);

    Код: RUR

    Наименование: Российский рубль

    Кратность: 1

    Курс: 1

    У основной валюты учета курс и кратность обычно равны единице (ее саму с собой сравнивают).


  • Вводим значение константы "ОснВалюта" – рубль;


  • Возвращаемся к справочнику валют и вводим еще одну валюту;

    Код: BST

    Наименование: Басурманский тугрик

    Кратность: 1000

    Курс: 22.77


  • 2.6 Справочник контрагентов.

    Контрагенты это те фирмы, с которыми мы будем вести торговые операции. Контрагенты у нас будут делиться на две большие группы: Поставщики и Покупатели. Какую информацию мы хотим хранить о клиенте. Во-первых его код, под которым мы его зарегистрируем в своих бухгалтерских книгах. Код – числовой, длинной не более 4-х символов, по каждой группе раздельный (т.е. и в Поставщиках и в Покупателях у нас будут контрагенты с номером 1). Код будет идти по возрастающей. Во-вторых, название фирмы. В-третьих, валюта работы с контрагентом. В-четвертых, его юридический адрес;

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

    Подчинен: нет

    Количество уровней: 2

    Код: 4 Тип кода: число Серии кодов: подчинение

    Наименование: 50

    Основное представление: наименование

    Группы сверху: да

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

    Одна форма для элемента и группы?: нет

    Редактировать: в диалоге

    "Код" – номер контрагента для учета.

    "Наименование" – Полное название контрагента.

    Реквизит

    Описание

    ТипЗначения

    Доп.

    Исп.

    Изм.

    Валюта

    валюта работы

    С.Валюты

    Э

    Адрес

    Юридический дрес контрагента

    Строка неогр.

    Э

    Создаем справочник:

  • Создадим форму группы. В ней кроме кода и наименования ничего нет, и ладно. Код создается автоматически, поэтому сделаем поле ввода кода в форме группы недоступным. В свойствах поля ввода укажем "Сделать недоступным" – да. Расставим элементы в экранной форме поудобнее;


  • Форма группы готова. Закрываем ее;


  • Создаем форму элемента;


  • Поле "Код" делаем недоступным, а поле "Адрес" – многострочным;


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


  • Процедура ВводНового()

    Валюта=Константа.ОснВалюта;

    // Это чтоб руками каждый раз не забивать

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

  • Заведем две константы – "ОснПоставщик" и "ОснПокупатель", обе типа С.Контрагент;


  • 2.7 Работа со справочником контрагентов.

    Теперь мы можем заполнить наш справочник контрагентов




    Форма документа


    Для пользователя содержимое документа представляется в экранной форме документа:
    Форма документа


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

    Предопределенные процедуры.
    Для обслуживания работы действий с документами в системе 1С имеется большое количество предопределенных процедур. Однако, прежде чем приступить к описанию последних, сделаю важное пояснение. Документ как объект конфигурации содержит ДВА РАЗНЫХ программных модуля.
    1. Один их них (Модуль документа) запускается при интерактивном или программном выполнении некоторых важных действий: проведение, отмена проведения, удалении проведенного документа, архивации записей журнала расчетов, порожденных документом. Фактически вышеприведенные действия сопоставляются с соответствующими предопределенными процедурами модуля документа. Операторам модуля доступны все реквизиты документа, но не доступны реквизиты экранной формы документа.
    Предопределенные процедуры, принадлежащие модулю документа:








    Форма элемента и форма группы


    Если справочник имеет сложную структуру, тогда его элементы удобнее редактировать в отдельном окне, а не в списке. Ниже приведена форма элемента справочника Сотрудники.
    Форма элемента и форма группы

    В форме элемента справочника также есть предопределенные процедуры (события):








    Форма списка справочника


    Для удобства работы пользователей со справочником на этапе конфигурирования можно создать несколько видов экранных форм для показа справочника. В зависимости от контекста вызова справочника можно задать использование определенного диалога для работы с ним.
    Лучше один раз увидеть, чем сто раз услышать, поэтому ниже для примера приведена форма списка справочника Сотрудники:








    Форма журнала документов


    Каждый документ представляется в журнале документов отдельной строкой. Журнал содержит колонки, состав которых настраивается программистом. Кроме того, форма журнала документов может содержать любые другие элементы управления: кнопки, переключатели, информационные поля. Они могут быть сверху, снизу или сбоку.
    Форма журнала документов

    Интервал журнала
    В журнале документов можно установить интервал. Тогда он будет показывать только те документы, у которых дата попадает в этот интервал. Для установки интервала предусмотрена специальная кнопка на панели инструментов журнала. Кроме того, интервал можно установить программно методом УстановитьИнтервал
    Графы журнала

    В конфигураторе можно настраивать графы журнала (колонки). Например, в приведенной выше форме графа Сотрудник отображает ФИО сотрудника, для которого был сделан документ
    Форма журнала документов

    Отбор, закладки отбора
    В журнале документов можно программно или вручную установить отбор, тогда журнал будет показывать только нужные пользователю документы. Для установки отбора вручную предназначена специальная кнопка на панели инструментов журнала. Отбор можно установить по общим графам документов, а также по виду документов. Нельзя установить отбор по двум критериям одновременно. Отбор возможен только в ОБЩИХ журналах! Для упрощения процедуры отбора могут быть использованы закладки. Для этого используется метод ЗакладкиОтбора.
    Предопределенные процедуры

    Такие процедуры вызываются системой 1С при наступлении определенных событий в форме журнала документов. Фактически это обработчики событий.








    Функции в запросе


    Этот запрос совершает очень полезную работу: он подсчитывает, сколько сотрудников работает по каждой должности. Другие возможные функции приведены в Синтакс-помощнике.
    Запрос = СоздатьОбъект("Запрос");

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

    |Долж = Справочник.Сотрудники.Должность;

    |Группировка Долж упорядочить по Долж.Наименование;

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

    |";

    Запрос.Выполнить(ТекстЗапроса);

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

    ...Сообщить("По должности " + Строка(Запрос.Долж) +

    .............." работает " + Строка(Запрос.Колво) + " чел.");

    КонецЦикла;




    Болт М16 ГОСТ


    Болт М16 ГОСТ 7798-70

    1

    Гайка М16 ГОСТ 5927-70

    1

    Шайба М16 ГОСТ 11371-78

    4



    Справочник складов


    С товарами, кажется, разобрались. Давайте сделаем наипростейший справочник складов. На складах мы будем хранить наш товар.
  • Создаем новый справочник;

  • Идентификатор "Склады", комментарий "склады", в интерфейс включаем;

  • В свойствах ничего менять не будем, и так сойдет;

  • Никаких новых реквизитов не надо;

  • Редактирование оставим в форме списка;

  • Создадим теперь эту форму списка;

  • Отредактируем только размеры;

  • Закроем форму списка и свойства справочника;

  • Сохраним изменения и откроем 1С:Предприятие;

  • Войдем через меню Справочники в справочник "Склады";

  • Создадим три склада: Склад №1, Склад №2 и Склад №3;

  • Закроем 1С:Предприятие.

  • 2.8 Справочник контрагентов
    Контрагенты это те фирмы, с которыми мы будем вести торговые операции. Контрагенты у нас будут делиться на две большие группы: Поставщики и Покупатели (ага, у нас будут группы, значит число уровней как минимум два). Какую информацию мы хотим хранить о клиенте. Во-первых его код, под которым мы его зарегистрируем в своих бухгалтерских книгах. Код – числовой, длинной не более 4-х символов, по каждой группе раздельный (т.е. и в Поставщиках и в Покупателях у нас будут контрагенты с номером 1). Код будет идти по возрастающей. Во-вторых, разумеется, название фирмы, в-третьих – адрес, в-четвертых – дата занесения контрагента в наш реестр контрагентов, по этому полю мы хотим иметь возможность сортировать список контрагентов. Займемся конструированием этого справочника. Для удобства мы в дальнейшем будем сводить эти сведения в виде таблицы:






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

    Подчинен: нет

    Количество уровней: 2

    Код: 4 Тип кода: число Серии кодов: подчинение

    Наименование: 50

    Основное представление: наименование

    Группы сверху: да

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

    Одна форма для элемента и группы?: нет

    Редактировать: в диалоге

    "Код" – номер контрагента для учета.

    "Наименование" – Полное название контрагента.






    Глобальный модуль


    В системе 1С есть так называемый Глобальный модуль. Он относится к конфигурации в целом. Глобальный модуль нужен для того, что писать процедуры и функции, доступные в любом месте программы (в любом другом модуле). Для этого необходимо просто указать ключевое слово Экспорт. Также можно создать глобальные переменные, которыми можно будет пользоваться в любом месте программы. Но чем меньше будет таких глобальных переменных, тем лучше, так как модули получаются более независимыми друг от друга, что снижает количество ошибок в программе и облегчает отладку.




    Группировка и сортировка


    Практически в любом запросе есть ключевое слово Группировка. Оно означает, что нужно выбрать из таблицы только те записи, у которых значение определенного поля различается. Этот запрос выберет из справочника Сотрудники список используемых должностей и отсортирует этот список по алфавиту.
    Запрос = СоздатьОбъект("Запрос");

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

    |Долж = Справочник.Сотрудники.Должность;

    |Группировка Долж упорядочить по Долж.Наименование;

    |";

    Запрос.Выполнить(ТекстЗапроса);

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

    ............Сообщить(Запрос.Долж);

    КонецЦикла;




    Группы расчетов


    Для того чтобы при тех или иных расчетах можно было оперировать не только результатами расчетов по конкретным видам, но и результатами по нескольким видам расчетов, объединенных по определенному принципу, служит понятие групп расчетов. Примерами групп расчета могут служить: «начисления, облагаемые подоходным налогом», «начисления, входящие в расчет средней зарплаты», «все удержания» и другие.




    Иерархические справочники


    Список элементов справочника в системе 1С:Предприятие может быть многоуровневым. В этом случае все строки справочника будут разделяться на 2 вида: «просто» элементы справочника и группы справочника. Группы позволяют переходить на нижележащие уровни многоуровневого справочника. Возможное количество уровней вложенности справочника задается в Конфигураторе.
    Использование многоуровневых справочников позволяет организовать ввод информации в справочник с нужной степенью детализации. Элементы и группы элементов в многоуровневом справочнике можно переносить из одной группы в другую.




    Иерархические справочники


    Список элементов справочника в системе 1С:Предприятие может быть многоуровневым. В этом случае все строки справочника будут разделяться на 2 вида: «просто» элементы справочника и группы справочника. Группы позволяют переходить на нижележащие уровни многоуровневого справочника. Использование многоуровневых справочников позволяет организовать ввод информации в справочник с нужной степенью детализации. Элементы и группы элементов в многоуровневом справочнике можно переносить из одной группы в другую.








    Информация о текущем элементе


    Если справочник подчиненный, то будет полезным применение следующих методов и атрибутов, которые позволяют получить информацию о текущем элементе справочника:








    Информация о текущем элементе


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








    Итоги и группировка таблицы значений


    //получить итог по колонке можно методом Итог

    ВсеОклады = ТабЗнач.Итог("Оклад")
    //часто требуется группировать строки и подсчитывать итоги по группам,

    //в этом случае применяется метод Свернуть
    Синтаксис: Свернуть(<ГруппКолонки>,<СуммКолонки>)

    //проссумировать оклады по каждой должности

    ТабЗнач.Свернуть("Должность","Оклад");

    //Можно группировать и суммировать сразу по нескольким колонкам

    ТабЗнач.Свернуть("Категория, Должность","Оклад,Налог");




    Изменение заголовка таблицы


    Диаграмма1.Заголовок = "Поступления от покупателей";




    Элементы диалога на форме


    В модуле формы к элементам диалога можно обращаться по их идентификаторам через конструкцию Форма.ЭлементДиалога
    Форма.Сотрудник.Доступность(1); //сделать доступным

    Форма.Сотрудник.Доступность(0); //сделать недоступным

    Форма.Сотрудник.Видимость(1); //сделать видимым

    Форма.Сотрудник.Видимость(0); //сделать невидимым

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

    Форма.Кнопка.Заголовок("Далее >>");

    Форма.Кнопка.Заголовок("Готово!");
    //можно менять цвет элементов диалога

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

    ... Форма.Надпись_Сотрудник.Цвет(200,50,50); //красный, зеленый, синий (RGB)

    ....Активизировать("ВыбрСотрудник");

    Иначе

    ... Форма.Надпись_Сотрудник.Цвет(0,0,0);

    КонецЕсли;




    Этот страшный зверь - точка актуальности


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




    Кадровые документы


    Все кадровые документы (прием, увольнение и т.д.) отражаются в журнале "Кадровые документы".
    Кадровые документы

    Кнопка "Поиск по ФИО" вызывает справочник "Документы по ФИО", в котором все документы упорядочены по ФИО сотрудников. Так как журнал документов в 1С нельзя упорядочить по произвольному полю, то пришлось завести отдельный справочник, аналогичный журналу документов и поддерживать его в актуальном состоянии при записи и проведении документов.
    Кадровые документы

    Документ "Прием на работу" выглядит следующим образом:
    Кадровые документы

    В модуле документа при его записи проверяется соблюдение всех деловых правил организации. Например, для 1 и 2 категории должен быть указан оклад и кол-во ставок по штатному расписанию, а объект должен быть ИТР. Для 3 категории должен быть указан объект (не ИТР) и должен быть указан разряд и тариф. При проведении документа в справочник Сотрудники добавляется новый элемент.
    Документ "Кадровое перемещение " выглядит следующим образом:
    Кадровые документы

    В левой части документа отражаются сведения по указанному сотруднику на дату перемещения (прежнее место работы). В правой части документа пользователь указывает новое место работы. При проведении документ изменяет справочник "Сотрудники" и "Штатное расписание".
    Остальные документы ("Отпуск", "Больничный лист", "Увольнение") выглядят аналогичным образом.




    Календари и Праздники


    Для ведения рабочего графика предприятия или сторонних организаций, для учета рабочего времени сотрудников разных категорий в системе 1С:Предприятие служат календари. Примерами календарей могут служить: календарь рабочего графика предприятия (где отмечены выходные и рабочие дни); календарь работы банка, через который осуществляются взаиморасчеты; календарь работы служащих; календарь, в котором проставлена продолжительность рабочих дней для рабочих.
    Календарь представляет собой объект, который устанавливает для каждой календарной даты некоторое числовое значение, которое может интерпретироваться при работе программы тем или иным образом. Например, в календаре, представляющем собой график работы организации или предприятия, каждому рабочему дню может соответствовать единица, а каждому выходному — ноль. В календаре учета рабочего времени сотрудников предприятия каждой дате календаря может соответствовать число — продолжительность рабочего дня в часах и т. д.
    Праздники. Допустим, что у вас на предприятии несколько категорий работников, например 5 категорий, и для каждой категории заведен свой календарь. Представьте, что в стране объявлен всеобщий праздник, например, "День 1С". Используя данную функцию вы можете один раз завести этот праздник, и он автоматически отразится во всех календарях, у которых стоит флажок "Учитывать праздники". Красота!
    Журналы расчетов




    Конфигуратор


    Все начинается с запуска Конфигуратора. Программы для 1С:Предприятие называются "конфигурациями" и создаются они в специальном режиме для разработчика "Конфигуратор". Обычные пользователи работают в режиме "Предприятие".




    Мастер отчетов по сотрудникам


    Часто отделу кадров требуется вывести список сотрудников, но не всех, а только нужных, удовлетворяющих определенному условию. Кроме того, требуется их еще определенным образом сгруппировать и вывести только нужные сведения по сотрудникам. Все эти отчеты запрограммировать невозможно, поэтому выходом из положения стал Мастер отчетов, который позволяет сконструировать отчет, требуемый в данный момент.
    Итак, основные операции Мастера отчетов таковы:
  • группировка сотрудников, включая вложенные группировки

  • отбор сотрудников (фильтрация)

  • вывод дополнительных колонок по сотруднику (граф)

  • 1-й шаг Мастера отчетов по сотрудникам выглядит следующим образом:
    Мастер отчетов по сотрудникам

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

    Здесь пользователь может отфильтровать по категории, объекту или должности, по дате приема, по дате увольнения и по другим параметрам. Если он указывает несколько условий, то критерии отбора складываются (логическая операция И).
    2-й шаг Мастера отчетов по сотрудникам выглядит следующим образом:
    Мастер отчетов по сотрудникам

    На этом шаге пользователь задает вывод дополнительных сведений по сотруднику. Это возможно если только на первом шаге была задействована группировка "Сотрудник". Пользователь помечает галочками те колонки, которые он хочет видеть в отчете.
    Примеры работы Мастера приведены ниже:
    1. Указаны группировка Категория и группировка Сотрудник
    Мастер отчетов по сотрудникам

    2. Указана группировка Сотрудник, фильтр по объекту ИТР и дополнительные графы Оклад и Ставка.
    Мастер отчетов по сотрудникам

    2. Указана группировка Категория и группировка Должность (группировка Сотрудник не указана, поэтому фамилии сотрудников не выводятся, а подсчитывается количество сотрудников в данной группе).
    Мастер отчетов по сотрудникам

    Простой склад










































    Глава 1

    Постановка задачи

    Создание конфигурации

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

    Глава 2

    Начало работы с метаданными.

    Создание пользователя.

    В этой главе мы сотворим пустую конфигурацию, которую будем разрабатывать в дальнейшем.

    Глава 3

    Справочник товаров

    В этой главе мы наколдуем самый главный справочник в нашей системе, который будет хранить номенклатуру склада. Этот справочник будет многоуровневым (иерархическим).

    Глава 4

    Справочник складов

    Справочник контрагентов

    Справочник сортов

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

    Глава 5

    Взаиморасчеты с контрагентами

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

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

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

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

    Глава 6

    Документ "Изменение цен"

    Регистры по товарам

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

    Глава 7

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

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

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

    Глава 8

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

    Расходная накладная

    Накладная на перемещение

    Второе важнейшее событие, связанное с товарооборотом - отпуск товара со склада, а также перемещение товара между складами.

    Глава 9

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

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

    Отчет по обороту товара

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

    Глава 10

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

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

    В этой главе мы распределим права доступа и разработаем интерфейс для каждого типа пользователя. После этого наша волшебная складская система будет готова к работе!





    Метод Актуальность


    Устанавливает или сбрасывает признак актуальности временных итогов.
    Данный метод позволяет организовать поддержку временного расчета итогов в актуальном состоянии. При установке объекту «БухгалтерскиеИтоги» признака поддержки в актуальном состоянии, в нем будут отражаться все изменения в итогах, выполняемые операциями. При этом данный актуальный объект «БухгалтерскиеИтоги» смогут автоматически использовать временные расчеты и запросы других объектов «БухгалтерскиеИтоги» с аналогичными фильтрами, что позволяет оптимизировать время расчета.
    Данную возможность следует использовать только в специальных случаях, например, для оптимизации больших регламентных расчетов. Данная возможность может применяться только при работе программы в монопольном режиме или, если не в монопольном режиме, то только при проведении документа.
    Синтаксис: Актуальность(<Флаг>)
    <Флаг>: 1 — поддерживать временный расчет в актуальном состоянии; 0 — не поддерживать;
    Бухгалтерский запрос
    Для получения большого количества итогов в различных разрезах объект «Бухгалтерские Итоги» переключается в режим работы с запросом. Для переключения в этот режим вызывается метод ВыполнитьЗапрос в параметрах которого, а также дополнительными методами устанавливается состав итогов, которые будут получены запросом. Выполнение данного метода осуществляет выборку данных и их предварительную обработку.
    После выполнения запроса с помощью специального набора методов объекта «Бухгалтерские Итоги» осуществляется получение итогов, полученных данным запросом. К этим методам относятся методы обхода итогов в различных разрезах (сформированных запросом) и методы для получения собственно итогов. Кроме того специальный набор атрибутов объекта «Бухгалтерские Итоги» позволяет обращаться процессе обхода результатов запроса к значениям полученных группировок.




    Метод ИспользоватьКорСубконто


    Метод ИспользоватьКорСубконто устанавливает режим отбора итогов по субконто методом ВыполнитьЗапрос. Метод ИспользоватьКорСубконто слудет вызывать до вызова метода ВыполнитьЗапрос. После выполнения метода ВыполнитьЗапрос установки метода ИспользоватьКорСубконто сбрасываются и перед слудеющим запросом их нужно устанавливать заново.
    Метод ИспользоватьКорСубконто может вызываться последовательно несколько раз. В этом случае установки, выполняемые этим методом суммируются.
    Синтаксис: ИспользоватьКорСубконто(<ВидСубконто>, <Субконто>, <ТипФильтра>, <ПоГруппам>)
    Параметры аналогичны параметрам метода ИспользоватьСубконто.




    Метод ИспользоватьСубконто


    Метод ИспользоватьСубконто устанавливает режим отбора итогов по субконто методом ВыполнитьЗапрос. Метод ИспользоватьСубконто слудет вызывать до вызова метода ВыполнитьЗапрос. После выполнения метода ВыполнитьЗапрос установки метода ИспользоватьСубконто сбрасываются и перед слудеющим запросом их нужно устанавливать заново.
    Метод ИспользоватьСубконто может вызываться последовательно несколько раз. В этом случае установки, выполняемые этим методом суммируются.
    Синтаксис: ИспользоватьСубконто(<ВидСубконто>, <Субконто>, <ТипФильтра>, <ПоГруппам>)








    Метод Опции


    Синтаксис: Опции(<ВключатьЗабалансовыеСуммы>, <ВключатьОборотныеСубконтоСуммы>)
    Метод Опции должен вызываться до выполнения метода ВыполнитьЗапрос. Он устанавливает режимы включения в итоги сумм по забалансовым счетам и оборотным субконто. Если метод не вызвался, суммы по забалансовым счетам и оборотным субконто не включаются в запрос.
    Если параметр равен 1, то эти суммы включаются в запрос, если 0, то не включаются.




    Метод Рассчитать


    Синтаксис

    Рассчитать(<НачалоПериода>, <КонецПериода> , <ФильтрПоСчетам>, <ТолькоСинтетика> , <ПланСчетов>, <РазделительУчета>)








    Метод ВключатьСубсчета


    Метод ВключатьСубсчета должен вызываться до выполнения метода ВыполнитьЗапрос. Он устанавливает режим, при котором итоги отбираемые запросом будут разворачиваться по субсчетам соответвенно основных и корреспондирующих счетов.
    Синтаксис: ВключатьСубсчета(<ФлагСчета>, <ФлагКоррСчета>}








    Метод ВыполнитьЗапрос


    Синтаксис: ВыполнитьЗапрос(<НачалоПериода>, <КонецПериода>, <ФильтрПоСчетам>, <ФильтрПоКоррСчет>, <Валюта>, <ТипИтогов>, <Периодичность>, <ТипСуммы>)








    Методы периодических реквизитов


    //так мы узнаем, какая была у сотрудника категория на определенную дату

    Катег = СпрСотр.Категория.Получить(НекаяДата);
    //так мы установим сотруднику категорию на определенную дату

    СпрСотр.Категория.Установить(НекаяДата, НоваяКатегория);




    Методы работы с периодом журнала расчетов


    НачалоПериода = ЖЗ.НачалоТекущегоПериода();

    КонецПериода = ЖЗ.КонецТекущегоПериода();

    ПериодСтрокой = ЖЗ.ОписательПериода(НачМес); //например "Январь 2002 г"
    Виды и группы расчета




    Методы УстановитьЗначение и ПолучитьЗначение


    Эти методы позволяют обращаться к данным в таблице значений для чтения и записи.

    Они могут пригодиться в особых случаях при написании универсальных программ (мастеры отчетов и т.д.).
    Синтаксис: УстановитьЗначение(<Строка>,<Колонка>,<Знач>)

    Синтаксис: ПолучитьЗначение(<Строка>,<Колонка>)
    ТабЗнач.НоваяСтрока();

    ТабЗнач.УстановитьЗначение(1,"Номер",100);

    ТабЗнач.УстановитьЗначение(1,"Сотрудник","Иванов Иван Иванович");

    ТабЗнач.УстановитьЗначение(1,3,10000); //обращение к 1-й строке и 3-й колонке ("Оклад")
    Номер = ТабЗнач.ПолучитьЗначение(1,"Номер");

    ФИО = ТабЗнач.ПолучитьЗначение(1,"Сотрудник");

    Оклад = ТабЗнач.ПолучитьЗначение(1,3); //обращение к 1-й строке и 3-й колонке "Оклад"




    Минимальный кадровый учет


    В конфигурации есть 2-хуровневый справочник Сотрудники, содержащий две системные группы: Работающие и Уволенные. Ввод нового сотрудника производится документом "Прием на работу".
    В конфигурации есть три кадровых документа, обеспечивающих самые обязательные операции по движению кадров: "Прием на работу", "Перемещение", "Увольнение". Эти документы хранятся в журнале "Кадровые документы".
    По каждому сотруднику хранится следующая информация:
  • Табельный номер (реквизит Код)

  • ФИО (реквизит Наименование)

  • Категория*

  • Подразделение*

  • Должность*

  • Разряд*

  • Оклад*

  • Календарь*

  • Дата приема

  • Дата увольнения

  • Реквизиты, отмеченные звездочкой, являются периодическими. Это означает, что в программе хранится история их изменения по датам. Изменение этих реквизитов должно оформляться кадровым документом "Перемещение". Реквизиты "Дата приема" и "Дата увольнения" заполняются автоматически при проведении документов "Прием на работу" и "Увольнение". При увольнении сотрудник автоматически переходит в группу Уволенные.




    Модуль формы списка



    Модуль формы списка


    Модуль формы списка содержит процедуры и функции, которые действуют в контексте данной формы (в контексте объекта Справочник).




    Модули, процедуры и функции


    Вся конфигурация, как вы уже наверное заметили, состоит из модулей. Это могут быть модули документов или модули отчетов или другие модули. Модули состоят из процедур и функций. Процедура -- это небольшая программа для выполнения определенной задачи. Функция отличается от процедуры, только тем, что имеет результат. Говорят, "функция возвращает результат". Например, модуль "Приказа о приеме на работу" может иметь следующие процедуры ПроверитьПравильность( ) и
    НапечататьПриказ( ).





    Начало работы


    Порядок начала работы и ввода остатков:

    1. Заполняются константы и справочники.

    Справочник номенклатуры удобнее заполнять по ходу работы.

    Сервис-Параметры-Общие установить 4 цифры в датах.

    Сервис-Параметры-Журналы установить период видимости журналов

    начало года - конец года или по Вашему усмотрению.

    2. Вносятся остатки товара на складе.

    Приходная накладная со статусом документа ВводОстатков.

    3. Вносятся остатки товара по точкам.

    Документ реализатора со статусом документа ВводОстатков.

    4. Вносятся остатки взаиморасчетов с клиентами.

    Документ Остатки взаиморасчетов.
    Импорт из типовой торговой конфигурации 7.XXX:

    1. Из типовой конфигурации выполнить обработку EX_TRADE.ERT

    Установить дату нач. и дату кон. на текущую дату они влияют на выборку периодических реквизитов.

    Выгрузить Склады, Пользователей, Номенклатуру, Контрагентов

    2. Из новой конфигурации выполнить загрузку Склады, Пользователей, Номенклатуру, Контрагентов

    3. Для переноса некоторых реквизитов можно использовать обработку EX_SPRAV.ERT

    При этом для сязи баз используется поле НАИМЕНОВАНИЕ а конкретный реквизит справочника

    Вы можете задать в коде обработки.
    4. В типовой конфигурации создайте документ ИНВЕНТАРИЗАЦИЯ_РЕАЛИЗАТОРА для каждого реализатора

    И выгрузите в файл через обработку EX_TRADE.ERT.

    Для файла обмена лучше задавать полный путь файла например: C:\OST1.TXT

    5. В типовой конфигурации создайте документ ИНВЕНТАРИЗАЦИЯ для каждого склада

    И выгрузите в файл через обработку EX_TRADE.ERТ

    6. В новой конфигурации выполните обработку DOC_EXCH.ERT

    Указывайте правильно имена файлов обмена.

    Для остатков склада нажимайте кнопку загрузка в ПРИХОДНУЮ_НАКЛАДНУЮ

    Для остатков реализатора нажимайте кнопку загрузка в ДОКУМЕНТ_РЕАЛИЗАТОРА

    Исправьте шапки документов. Укажите правильно статус документа. (ВводОстатков)




    Накладная на выпуск из производства




    20 (Основное производство)


    70 (Расчеты с персоналом по оплате труда)




    40 (Выпуск продукции (работ, услуг))


    20 (Основное производство)









    Налоговые льготы сотрудника


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




    Наполнение данными диаграммы


    Диаграмма как объект системы 1С принадлежит таблице, в которую она вставлена. Обращение к объекту происходит в момент вывода на печать таблицы (метод Вывести()) или секции таблицы (метод ВывестиСекцию()), в которую вставлена диаграмма. Для того, чтобы при обращении были выполнены некоторые действия по подготовке данных для диаграммы, в свойствах объекта на закладке "Текст" необходимо указать строку вызова соответствующей процедуры, передав ей в качестве параметра контекст диаграммы как текущего объекта таблицы. Строка может выглядеть, например, так:
    ОбработкаДиаграммы(Таб.ТекущийОбъект)

    где: ОбработкаДиаграммы - имя процедуры, Таб - имя выходной таблицы (должна быть предварительно создана методом СоздатьОбъект()).
    В модуле описывается процедура с идентификатором, через который будет производиться к контексту диаграммы:
    Процедура СформироватьДиаграмму(Диаграмма1)

    где Диаграмма1 - идентификатор, в который передается контекст объекта Диаграмма. Все методы объекта записываются через точку после идентификатора.




    Наряд на сборку




    20 (Основное производство)


    10.2 (Материалы.Покупные полуфабрикаты и комплектующие изделия, конструкции и детали)









    Назначение документов


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




    Назначение конфигуратора


    Конфигуратор системы 1С:Предприятие является специальным режимом запуска 1С и предназначен для разработчиков, программистов. В этом режиме разработчик создает или корректирует структуру базы данных, программные модули, производит административные работы. В режиме Конфигуратора нельзя вводить информацию в базу данных, за исключением загрузки базы данных из архивов. Обычные пользователи работают в другом режиме "Предприятие". В этом режиме возможен ввод данных, заполнение справочников и ввод документов, формирование отчетов и запуск обработок. В режиме Предприятие нельзя редактировать структуру конфигурации.
    Итак, основное правило:

    В режиме Конфигуратор - мы определяем структуру базы данных и пишем программы.

    В режиме Предприятие мы используем программы и вводим данные.




    Назначение конструкторов


    Конфигуратор системы 1С:Предприятие включает набор Конструкторов — вспомогательных инструментов, облегчающих и ускоряющих создание типовых элементов конфигурации. Конструктор «ведет пользователя за руку» по этапам создания объекта метаданных, снабжая подсказками и позволяя, если необходимо, возвращаться к предыдущим этапам и переопределять ранее заданные параметры.
    Конструкторы позволяют создать объект метаданных (справочник, документ), помогают написать программу или запрос на встроенном языке 1С, формируют макет отчета (секции таблиц и т.д.).
    Пользуйтесь конструкторами, но не забывайте, что то же самое можно сделать "ручками". Иногда это труднее, но позволяет сделать ВСЕ, на что способна 1С. Это примерно так же, как знать HTML и знать Dreamweaver. С помощью Dreamweaver создавался этот сайт, но иногда приходилось подправлять "ручками" HTML-код. Такая совместная работа конструктора и человека неимоверно эффективна! Для простых задач можно пользоваться конструкторами. Для сложных задач или для реализации некоторых "изюминок" приходится стучать по клавиатуре. Такова селяви, как любят говорить русские.




    Назначение отчетов


    Отчеты предназначены для вывода информации из базы данных. Отчеты похожи на документы, только эти объекты выполняют разные функции. Документы вводят информацию в базу данных, отчеты выводят результаты.




    Назначение подчиненных справочников


    Любой справочник может использоваться как сам по себе, так и быть подчиненным какому-либо другому справочнику. Например, справочник договоров может использоваться отдельно, а может быть связан со справочником организаций.
    Чтобы подчинить справочник какому-либо из справочников, уже существующих в системе, в поле «Подчинен» следует выбрать наименование этого справочника. Такой справочник в системе 1С:Предприятие называется владельцем.
    В отличие от многоуровневого справочника, в котором все элементы имеют одинаковую структуру, использование механизма подчиненных справочников позволяет связать элементы разной структуры. В этом случае каждый элемент подчиненного справочника будет связан с одним из элементов справочника-владельца.
    Внешне работа с подчиненным справочником в системе 1С:Предприятие будет выглядеть следующим образом.
    Если для подчиненного справочника установлен режим показа в виде иерархического списка, то перед использованием справочника сначала должен быть выбран элемент справочника-владельца. При показе на экране подчиненный справочник будет содержать в своем заголовке наименование элемента-владельца, а список элементов подчиненного справочника будет содержать только элементы, относящие к элементу-владельцу. При смене элемента-владельца информация в окне подчиненного справочника будет соответствующим образом обновлена.
    Если открыть подчиненный справочник, не выбрав элемент-владелец, то в окне подчиненного справочника не будет отображаться ни одного элемента, а в заголовке окна будет выдано сообщение «Не задан элемент-владелец».
    При работе с системой 1С:Преднриятие для подчиненного справочника может быть отключен показ в виде иерархического списка. В этом случае в окне подчиненного справочника будут отображаться все элементы этого справочника, то есть элементы, починенные разным владельцам, будут показываться вперемешку. Тем не менее, любой элемент подчиненного справочника «знает» своего владельца: если для справочника включен режим «Редактировать в диалоге» (см. ниже п. «Создание форм справочника»), наименование элемента-владельца будет выдаваться в заголовке окна редактирования элемента справочника.




    НДС




    1


    М12




    АБВ-123


    Изделие №1


    5.00


    70.00







    НДС


    1
    Болты (ГОСТ 7798-70)
    1
    Болт М12
    осн ставка
    2
    Болт М16
    осн ставка
    2
    Гайки
    1
    Высокие (ГОСТ 15524-70)
    1
    Гайка М12
    осн ставка
    2
    Гайка М16
    осн ставка
    2
    Средние (ГОСТ 5927-70)
    1
    Гайка М12
    осн ставка
    2
    Гайка М16
    осн ставка
    3
    Низкие (ГОСТ 5929-70)
    1
    Гайка М12
    осн ставка
    2
    Гайка М16
    осн ставка
    3
    Шайбы (ГОСТ 11371-78)
    1
    Шайба М12
    осн ставка
    2
    Шайба М16
    осн ставка
    2.11 Справочник Изделия.
    Давайте перейдем к более подробному рассмотрению высокотехнологичной продукции фирмы. В сих сложных изделиях нас будет интересовать следующее: расценка на единицу изделия, цена отпускная, ставка НДС. Изделия у нас будут делиться на две группы по диаметру резьбы (М12 и М16).

    Для расчета себестоимости можно было бы завести реквизиты по каждому виду комплектующих (Болт, Гайка, Шайба) и реквизиты, указывающие количество каждого вида, но этот путь крайне нерационален (и он противоречит правилам нормализации баз данных – а это священная корова!!!). Спецификацию составных частей мы будем держать в отдельном, подчиненном справочнике.

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

    Отпускная цена у нас будет значением периодическим, изменять мы ее будем руками. Цена измеряется в базовой валюте.

    Соберем все сведения по справочнику Изделия в таблицу:

    Идентификатор: Изделия

    Подчинен: нет

    Количество уровней: 2

    Код: 10 Тип кода: строка Серии кодов: подчинение

    Наименование: 25

    Основное представление: наименование

    Группы сверху: да

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

    Одна форма для элемента и группы?: нет

    Редактировать: в диалоге

    "Код" – артикул изделия.

    "Наименование" – Название изделия.
    Реквизит
    Описание
    ТипЗначения
    Доп.
    Исп.
    Изм.
    Расценка
    расценка операции "сборка"
    Число 10.2
    +
    Э
    Цена
    отпускная цена
    Число 10.2
    +, П
    Э
    Р
    НДС
    ставка НДС
    С.НДС
    Э



    Создаем справочник:

  • НДС
    НДС
    Создаем форму группы;


  • Создаем форму элемента;


  • В модуль формы элемента пишем процедуру:


  • Процедура ВводНового()

    НДС=Константа.ОснНДС;

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

  • Создаем форму списка;


  • НДС


    2.12 Справочник Комплектация.

    Как мы и договорились, спецификация на сборку изделия будет содержаться в специальном подчиненном справочнике. Код нам не нужен. В Наименовании мы будем держать название комплектующей. Саму ссылку на Комплектующую, мы запихнем в отдельный реквизит. И еще один реквизит мы создадим для указания количества комплектующих этого вида. Конечно, отдельные любители могут писать состав типа: болт, гайка, шайба, шайба, шайба, шайба. Но гораздо проще так: болт – 1 шт., гайка – 1шт., шайба – 4 шт. Хотя, и первый вариант не запрещен, мы за плюрализм мнений (кроме факта Нашей гениальности – это обсуждению не подлежит).

    Идентификатор: Комплектация

    Подчинен: Изделия

    Количество уровней: 1

    Код: 0 Тип кода: число Серии кодов: подчинение

    Наименование: 25

    Основное представление: наименование

    Группы сверху: да

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

    Одна форма для элемента и группы?: нет

    Редактировать: в диалоге

    "Код" – нет.

    "Наименование" – Название комплектующего.

    Реквизит

    Описание

    ТипЗначения

    Доп.

    Исп.

    Изм.

    Комплектующее

    то, что входит в спецификацию

    С.Комплектующие

    Кол

    количество комплектующих на одно изделие

    Число 3.0

    +

    Создаем справочник:

  • Создаем форму элемента;


  • Поле ввода "Наименование" сделаем недоступным, и будем пропускать при вводе;


  • В поле ввода "Комплектующее" в формулу пишем Компл();
    НДС


  • В модуль формы элемента пишем процедуру:


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

    НазвРодителя=СокрЛП(Комплектующее.Родитель.Наименование);

    Поз1=Найти(НазвРодителя,"(");

    Поз2=Найти(НазвРодителя,")");

    ГОСТ=Сред(НазвРодителя,Поз1+1,Поз2-Поз1-1);

    Наименование=СокрЛП(Комплектующее.Наименование)+" "+ГОСТ;

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

  • Создаем форму списка;


  • Поле Комплектующее в форму списка вставлять не будем, хватит и его названия в поле Наименование;


  • НДС


    2.13 Работа со справочниками Изделия и Комплектация.

    Справочники у нас готовы, заполним их каким-нибудь содержимым. Например:




    Непосредственное удаление


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

    СпрСотр.НайтиЭлемент(ВыбрСотрудник);

    СпрСотр.Удалить(); //непосредственное удаление




    Номер документа


    При интерактивном или программном создании нового документа ему автоматически присваивается новый уникальный номер. Его можно получить или установить какой-нибудь другой с помощью атрибута НомерДок:
    Док = СоздатьОбъект("Документ.Счет");

    Док.Новый();

    Сообщить("Документу был автоматически присвоен № " + Док.НомерДок);

    Док.НомерДок = "000013";

    Сообщить("Установлен новый № " + "000013");




    Объект "Периодический"


    Для работы с историей периодического реквизита очень удобно использовать объект "Периодический".
    Пример, вывести историю карьеры сотрудника за текущий год:
    ИсторияКарьеры = СоздатьОбъект("Периодический");

    ИсторияКарьеры.ИспользоватьОбъект("Должность",ВыбрСотрудник);

    ИсторияКарьеры.ВыбратьЗначения(НачГода(РабочаяДата(),КонГода(РабочаяДата()));

    Пока ИсторияКарьеры.ПолучитьЗначение()=1 Цикл

    ....Сообщить(Строка(ИсторияКарьеры.ДатаЗнач) + " " + Строка(ИсторияКарьеры.Значение));

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




    Объекты




    Справочники


  • Работодатели

  • Соискатели

  • Вакансии

  • Резюме

  • Должности





  • Перечисления


  • ВидОбразования

  • ГрафикРаботы

  • Пол





  • Обработки


  • ЧисткаБазы







  • Объекты




    Справочники


  • Пользователи

  • Черный список (подчинен спр. Пользователи)





  • Документы


  • Письмо

  • Сообщение





  • Журналы


  • Письма

  • Чат





  • Обработки


  • ЧисткаБазы







  • Объекты




    Справочники


  • Участники

  • Кошельки (доп. реквизит Участник)

  • Статьи доходов

  • Статьи расходов





  • Документы


  • Доход

    (реквизиты шапки: Участник, Статья, Кошелек, Сумма)

  • Расход

    (реквизиты шапки: Участник, Статья, Кошелек, Сумма)

  • Перевод

    (реквизиты шапки: КошелекОткуда, КошелекКуда, Сумма)

  • ВводНачОстатков

    (реквизиты табличной части: Кошелек, Сумма)

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




    Журналы документов


  • ВсеДокументы





  • Регистры


  • Кошельки (регистр остатков)

  • Доходы (оборотный регистр)

  • Расходы (оборотный регистр)





  • Отчеты


  • Остатки

  • ДоходыРасходы







  • Объекты




    Константы


  • МаксКолвоПредупреждений

  • МаксКолвоКнигНаРуках

  • КолвоДнейБлокировки

  • КолвоДнейДляВыдачи





  • Справочники


  • Произведения

  • Книги (подчинен спр. Произведения)

  • Читатели

  • ЖанрыКниг

  • Авторы





  • Перечисления


  • СтатусКниги (значения: Свободна, Выдана, Списана)

  • ДаНет (значения: Да, Нет)





  • Документы


  • ВыдачаКниги

  • ПродлениеКниги

  • ВозвратКниги

  • ПотеряКниги





  • Журналы документов


  • Библиотека





  • Отчеты


  • БиблиотечнаяВыписка

  • ДолгиЧитателя







  • Объекты




    Справочники


  • Клиенты

  • Товары

  • Курьеры

  • Районы



  • Объекты





    Документы


  • ПриходТовара

  • Заказ

  • СнятиеЗаказа

  • ПутевойЛист

  • ОтчетКурьера





  • Регистры










    Объекты




    Константы


  • НазваниеОрганизации

  • СтавкаПН (периодич.)





  • Справочники


  • Сотрудники

  • НалоговыеЛьготы (подчинен спр.Сотрудники)

  • Категории

  • Подразделения

  • Должности

  • Разряды

  • ТипНалоговойЛьготы

  • ОснованияУвольнения





  • Перечисления


    нет




    Документы


  • ПриемНаРаботу

  • Перемещение

  • Увольнение

  • НачалоМесяца

  • ВводНевыходов

  • ВводПремий





  • Журналы документов


  • КадровыеДокументы

  • Премии

  • Отклонения

  • Системные





  • Отчеты


  • ВедомостьНаЗарплату

  • РасчетныеЛисточки

  • Свод

  • ЛицевыеСчета

  • ПоискВидаРасчета





  • Календари


  • Табель_8час

  • Табель_7час





  • Журналы расчетов


  • Зарплата





  • Обработки


  • РасчетЗарплаты





  • Виды расчета


  • ПоОкладу

  • ПоТарифу

  • Невыход

  • Премия

  • СтандВычетНаСебя

  • СтандВычетНаДетей

  • Премия

  • Подоходный налог

  • НаРуки





  • Группы расчетов


  • ВсеНачисления

  • ВсеУдержания

  • ОблагаетсяПН

  • ВсеВычеты







  • Объекты конфигурации


    В конфигурации потребуется создать следующие объекты:








    Объекты конфигурации


    В конфигурации потребуется создать следующие объекты:








    Объекты конфигурации


    В конфигурации потребуется создать следующие объекты:








    Объекты конфигурации


    В конфигурации потребуется создать следующие объекты:








    Объекты конфигурации


    В конфигурации потребуется создать следующие объекты:








    Объекты конфигурации


    Игра реализована в виде внешнего отчета (ert-файл). Поэтому игру можно подключить к любой конфигурации и доставить радость вашим пользователям!
    Объекты конфигурации





    Объекты конфигурации


    Игра реализована в виде внешнего отчета (ert-файл). Поэтому игру можно подключить к любой конфигурации и доставить радость вашим пользователям!
    Объекты конфигурации





    Объекты конфигурации


    В конфигурации потребуется создать следующие объекты:








    Объекты конфигурации


    В конфигурации потребуется создать следующие объекты:








    Объекты, свойства и методы


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




    Объекты




    Справочники


  • Материалы (количество уровней: 3)

  • Склады





  • Документы


  • Приход

    (реквизиты шапки: Склад,

    реквизиты табличной части: Материал, Количество)

  • Расход

    (реквизиты шапки: Склад,

    реквизиты табличной части: Материал, Количество)

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




    Журналы документов


  • Складские





  • Регистры


  • ОстаткиМатериалов





  • Отчеты


  • ОстаткиМатериалов







  • Обороты между счетами


    ОБ(<СчетДеб>, <СчетКред>, <ТипСуммы>, <Валюта>)
    Метод возвращает оборот с дебета счета <СчетДеб> в кредит счета <СчетКред>.
    Пример
    КассаБанк = БухИтоги.ОБ("50", "51");




    Обработка "Чистка базы"


    Данная обработка находит старые прочитанные письма, а также старые сообщения, и помечает их на удаление.
    Обработка

    Денежки




    Обработка "Чистка базы"


    Данная обработка находит вакансии и резюме, срок размещения которых истек, и помечает их на удаление.
    Обработка

    Почтальон Печкин




    Обработка результатов запроса (обход группировок)


    Методы обхода группировок результата запроса приведены ниже:








    Обращение к атрибутам по имени


    При работе с метаданными часто применяются следующие методы:








    Обращение к движениям регистра


    РегТовары = СоздатьОбъект("Регистр.Товары");
    РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);

    Пока РегТовары.ПолучитьДвижение()=1 Цикл

    ........Сообщить("Дата движения " + Строка(РегТовары.ТекущийДокумент.ДатаДок));

    ........Сообщить("Клиент: " + РегТовары.Клиент);

    ........Сообщить("Товар: " + РегТовары.Товар);

    ........Сообщить("Сумма: " + РегТовары.Доход);

    КонецЦикла;




    Обращение к файловой системе


    Для работы с файловой системой предназначен объект "ФС". В принципе его не требуется создавать с помощью функции СоздатьОбъект. Можно считать, что он уже создан. Но 1С позволяет создать сколько угодно таких объектов при помощи функции СоздатьОбъект;
    Пример:
    ГдеМыНаходимся = ФС.ТекКаталог();

    ФС.СоздатьКаталог("DOCS");

    НовФС = СоздатьОбъект("ФС");
    Объект "ФС" имеет следующие методы:








    Обращение к итогам оборотного регистра


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

    //установить период выборки "30 ноября 2001 года"

    РегДоходы.ИспользоватьПериод(2001,11,30);

    1. Метод Итог



    Пример:

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

    Доход = РегДоходы.Итог(ТекКлиент, ТекТовар, "Доход");

    2. Метод Итоги

    Пример:

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

    РегДоходы.Итоги(ТекКлиент, ТекТовар);

    Доход = РегДоходы.Доход;
    3. Метод СводныйИтог

    Могут быть указаны не все измерения. Фиксируются только указанные измерения.

    Пример:

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

    ДоходПоКлиенту = РегДоходы.СводныйИтог(ТекКлиент,,"Доход");

    ДоходПоТовару = РегДоходы.СводныйИтог(,ТекТовар,"Доход");

    4. Метод СводныеИтоги

    Могут быть указаны не все измерения. Фиксируются только указанные измерения.

    Пример:

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

    РегДоходы.СводныеИтоги(ТекКлиент,); //указано только одно измерение

    ДоходПоКлиенту = РегДоходы.Доход;

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

    РегДоходы.СводныеИтоги(,ТекТовар); //указано только одно измерение

    ДоходПоТовару = РегДоходы.Доход;




    Обращение к итогам регистра остатков


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



    Пример:

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

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

    Стоимость = РегТовары.Остаток (ТекТовар, ТекСклад, "Стоимость");
    2. Метод Остатки

    Пример:

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

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

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

    Стоимость = РегТовары.Стоимость;
    3. Метод СводныйОстаток

    Могут быть указаны не все измерения. Фиксируются только указанные измерения.

    Пример:

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

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

    СтоимостьТовара = РегТовары.СводныйОстаток (ТекТовар,,"Стоимость");
    //получить стоимость всех товаров на данном складе

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

    4. Метод СводныеОстатки

    Пример:

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

    РегТовары.СводныеОстатки(ТекТовар,); //указано только одно измерение

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

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

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

    РегТовары.СводныеИтоги(,ТекСклад); //указано только одно измерение

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




    Обращение к итогам регистра


    1-й способ.

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

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

    Пока РегТовары.ПолучитьИтог()=1 Цикл

    ......Сообщить("Товар " + Строка(РегТовары.Товар) +

    ...................... " на складе " + Строка(РегТовары.Склад) +

    ...................... " кол-во: " + Строка(РегТовары.Количество) +

    ...................... " стоимость: " + Строка(РегТовары.Стоимость) +

    КонецЦикла;

    2-й способ. Выгрузка итогов в таблицу значений

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

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

    РегДоходы.ВыгрузитьИтоги(ТабЗнач);

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

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

    ......Сообщить("Товар " + Строка(ТабЗнач.Товар) +

    ...................... " на складе " + Строка(ТабЗнач.Склад) +

    ...................... " кол-во: " + Строка(ТабЗнач.Количество) +

    ...................... " стоимость: " + Строка(ТабЗнач.Стоимость) +

    КонецЦикла;




    Обратное значение в %




    без НДС


    0


    0




    осн ставка


    20


    16.67


    Заполним Константу "ОснНДС" значением "осн ставка";
    Глава 3
    2.10 Справочник Комплектующие.
    Сверхсложные изделия нашей фирмы собираются из покупных комплектующих. В комплектующих нас будут интересовать название, ставка НДС. Комплектующие мы будем делить на группы по видам: "Болты (ГОСТ 7798-70)", "Гайки", "Шайбы (ГОСТ 11371-78)". Группу "Шайбы" мы разделим еще на три подгруппы "Высокие (ГОСТ 15524-70)", "Средние (ГОСТ 5927-70)" и "Низкие (ГОСТ 5929-70)".





















    Идентификатор: Комплектующие

    Подчинен: нет

    Количество уровней: 3

    Код: 5 Тип кода: число Серии кодов: подчинение

    Наименование: 25

    Основное представление: наименование

    Группы сверху: да

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

    Одна форма для элемента и группы?: нет

    Редактировать: в диалоге

    "Код" – порядковый номер.

    "Наименование" – Название комплектующего.

    Реквизит

    Описание

    ТипЗначения

    Доп.

    Исп.

    Изм.

    НДС

    ставка НДС

    С.НДС


    Э


    Создаем справочник:
  • Создаем форму группы;

  • Создаем форму элемента;

  • В модуль формы элемента пишем процедуру:

  • Процедура ВводНового()

    НДС=Константа.ОснНДС;

    КонецПроцедуры
  • Создаем форму списка;

  • Заполняем:









  • Общая схема выполнения запроса


    Запрос -- это обращение к системе 1С с просьбой выбрать определенные данные из базы данных. Например, с помощью запроса можно быстро организовать выбор всех сотрудников с определенной должностью. Для организации запроса необходимо выполнить следующие действия.
    Запрос = СоздатьОбъект("Запрос");

    ТекстЗапроса = "<текст запроса на особом языке запросов>"

    Запрос.Выполнить(ТекстЗапроса);
    //далее идет обработка результатов запроса




    Общие свойства


    Работа объекта «БухгалтерскиеИтоги» во всех режимах имеет некоторые общие особенности. Значение типа «Счет» в параметры методов объекта может передаваться в виде строки, содержащей код счета. При ведении учета по нескольким планам счетов или с использованием разделителя учета на получение итогов в различных режимах запроса влияют установки методов ИспользоватьПланСчетов и ИспользоватьРазделительУчета.
    ИспользоватьПланСчетов(<ПланСчетов>)
    Метод ИспользоватьПланСчетов задает план счетов для метода получения итогов и ВыполнитьЗапрос для тех случаев, когда конкретный счет не указан или задается строкой символов.
    Если план счетов не установлен функцией ИспользоватьПланСчетов, будет использоваться основной план счетов, заданный в метаданных.
    Пример.

    БухИтоги.ИспользоватьПланСчетов(ПланыСчетов.Рабочий);
    ИспользоватьРазделительУчета(<РазделительУчета>)
    Метод ИспользоватьРазделительУчета задает значения разделителя учета для методов получения итогов и ВыполнитьЗапрос. Применение данного метода имеет смысл только если используется разделителель учета.
    Пример.

    БухИтоги.ИспользоватьРазделительУчета (Константа.ОснФирма);




    Ограничения


    Учет товара идет по беспартионной схеме, но есть динамический расчет партионности.

    При больших объемах баз данных этот расчет может занять несколько минут.

    Например в "Карточке оплаты" закрытие оплаты документов вычисляется динамически.

    В справочнике Номенклатуры 2 уровня

    Первый - для групп товара, второй для товара.

    Это ограничение связано с построением некоторых отчетов.




    Операции и проводки


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




    и время ТА. Примерный вид


    ПолучитьТА()
    Возвращает строку, содержащую дату и время ТА. Примерный вид результата этой функции: 09.04.02 08:30:12 Отдельно дату или время ТА можно с помощью функций ПолучитьДатуТА() и ПолучитьВремяТА()
    ПолучитьПозициюТА()
    Позиция ТА имеет такое же представление, как и позиция документа (см. выше). Посмотреть ее можно с помощью данной функции.
    ПолучитьДокументТА()
    Можно получить документ, который стоит на точке актуальности. Функция возвратит ссылку на этот документ:ПослДок = ПолучитьДокументТА();Сообщить("Последний документ имеет номер " + ПослДок.НомерДок);
    УстановитьТАна(Полож)
    Устанавливает ТА на начало даты или перед документом. Полож - переменная типа "Дата" или ссылка на документ. Метод можно использовать только в монопольном режиме.
    УстановитьТАпо(Полож)
    Метод похож на предыдущий, только устанавливает ТА на конец даты или после документа.
    АвтоВремяПослеТА()
    Метод документа изменяет предыдущую (в том числе и пользовательскую) установку автоматического времени нового документа так, чтобы он записывался со временем после ТА.
    ПроводитьПослеТА(ФлагНеПров, ФлагПров)
    Метод модуля формы документа изменяет предыдущую (в том числе и пользовательскую) установку проведения и перепроведения документа относительно ТА. Если флаги имеют значение "-1", документ будет проводиться (или перепроводиться) всегда задним числом (до ТА). Флаг с единицей установит режим проведения (перепроведения) в реальном потоке времени (т.е. после ТА). Для флага ФлагНеПров имеется дополнительное нулевое значение. В этом случае при проведении режима будет выбирать пользователь.
    ИтогиАктуальны()
    Метод предопределенной процедуры ОбработкаПроведения() модуля документа определяет актуальность итогов на момент проведения документа. Если метод возвратил значение "1", можно обращаться к текущим итогам с помощью методов объекта "Регистр" или с помощью запроса без указания конечной границы. Если метод возвратил "0", то необходимо запускать временный расчет регистра.


    или вид документа) данной последовательности.


    ПринадлежитПоследовательности(Докум)
    Определяет, принадлежит ли документ ( или вид документа) данной последовательности. Возвращает "1", если принадлежит, "0" - если нет.
    ПолучитьАтрибут(Имя)
    Получить значение последовательности по строке с именем последовательности. Обычно применяется для передачи контекста данной последовательности в переменную.
    ПолучитьПозицию(),

    ПолучитьДокумент()
    Схожие между собой методы, первый возвращает строковую позицию границы последовательности (ГП), а второй - ссылку на документ, на котором стоит граница последовательности.
    ПолучитьДату(),

    ПолучитьВремя(Ч,М,С)
    Тоже подобные методы, первый возвращает дату, а второй - время границы последовательности (ГП), причем часы, минуты, секунды записываются в разные переменные.
    Сравнить(Докум)
    Очень удобный метод для определения положения документа (или даты) относительно ГП. В параметр Докум можно записать дату, документ или позицию документа. Возвращает "-1", если ГП раньше, "0" - если равны, и "1", если ГП позже.
    Установить(Положение)
    Принудительно устанавливает ГП в позицию, указанную переменной Положение. В эту переменную можно передавать документ, дату или позицию документа. Осторожнее со сдвигом "вперед", документы до новой точки автоматически не перепроводятся.
    ВыбратьПоПоследовательности(ДатаНач, ДатаКон, Имя)
    Открывает выборку документов с ДатаНач по ДатаКон, принадлежащих указанной Последовательности. В качестве дат так же можно использовать документы или их позиции.


    Отключить режим добавления строк по


    Открыть(<ИмяФайла>)
    Открыть текстовый файл с указанным именем.
    КоличествоСтрок()
    Возвращает число строк в тексте.
    ПолучитьСтроку(<НомерСтроки>)
    Возвращает строку текста с заданным номером.
    ДобавитьСтроку(<Строка>)
    Добавить строку в конец текста.
    УдалитьСтроку(<НомерСтроки>)
    Удалить строку с указанным номером.
    ВставитьСтроку(<НомСтроки>,<Строка>)
    Вставить строку с указанным номером.
    ЗаменитьСтроку(<НомерСтроки>,<Строка>)
    Заменить строку с указанным номером.
    Шаблон(<Флаг>)
    Включить/ Отключить режим добавления строк по шаблону. Шаблон означает, что в квадратных скобках указаны имена переменных или выражения на встроенном языке. При формировании такой строки 1С вычислит все выражения в квадратных скобках и подставит их в строку.
    Пример, "Сотрудник с табельным номером [Сотрудник.Код] обработан." При формировании такой строки в режиме шаблона результирующая строка будет иметь вид: "Сотрудник с табельным номером 123 обработан."
    ФиксШаблон(<Флаг>)
    В отличие от метода Шаблон, ограниченные квадратными скобками поля замещаются значениями выражений с сохранением своей длины в символах, то есть обрезаются, если поле короче результата вычисления выражения и дополняются пробелами если длиннее. Если результат числовой, то в границах поля строка прижимается к правой границе.
    Показать(<Заголовок>,<ИмяФайла>)
    Открыть окно редактирования текста.
    ТолькоПросмотр(<Режим>)
    Разрешить / запретить возможность редактирования текста в окне просмотра. Вызывается до метода Показать.
    Очистить()
    Очищает содержимое текстового документа. Его использование позволяет заново заполнить содержимое текстового документа.
    КодоваяСтраница(<Режим>)
    Установить режим кодировки текста. 0 - windows-кодировка, 1 - DOS-кодировка.

    Возвращает текущее числовое значение режима кодировки (на момент до исполнения метода).
    Записать(<ИмяФайл>)
    Записать текст в файл с указанным именем.


    в окне диалога нажата кнопка


    ВыбратьФайл(<ИмяФайла>)
    Открывает окно диалога выбора/сохранения файла. Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена', 1 - если нажата кнопка 'ОК'.
    Синтаксис: ВыбратьФайл (<ТипДиалога>, <ИмяФайла>, <ИмяНачКаталога>, <ЗаголовокОкна>, <Фильтр>, <Расширение>, <Таймаут>)
    Параметры:

    <ТипДиалога> -: 0 - диалог типа <открыть>, 1 - диалог типа <сохранить>;

    <ИмяФайла> - переменная, содержащая на входе строку с именем файла, а на выходе - имя выбранного файла;

    <ИмяНачКаталога> - переменная, содержащая на входе строку с начальным каталогом, а на выходе - имя выбранного каталога;

    <ЗаголовокОкна> - строка с заголовком окна;

    <Фильтр> - строка с фильтром отбора файлов (например: 'Все файлы (*.*) |*.*');

    <Расширение> - строка с расширением файла по умолчанию;

    <Таймаут> - время ожидания отклика пользователя в секундах (необязателен).
    ВыбратьФайлКартинки
    Открывает окно диалога выбора/сохранения файла картинки.

    Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена', 1 - если нажата кнопка 'ОК'.

    Синтаксис: ВыбратьФайлКартинки (<ТипДиалога>, <ИмяФайла>, <ИмяНачКаталога>, <ЗаголовокОкна>, <Расширение>, <Таймаут>)
    ВыбратьКаталог
    Открывает окно диалога выбора каталога.

    Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена'; 1 - если в окне диалога нажата кнопка 'ОК', при этом в переменную <ИмяНачКаталога> возвращается имя выбранного каталога; -1 (минус единица) - закончилось время <Таймаут> ожидания отклика пользователя.

    Синтаксис: ВыбратьКаталог(<ИмяКаталога>,<ЗаголовокОкна>,<Таймаут>)
    СуществуетФайл
    Проверяет существование файла..

    Возвращает: 1 - файл существует; 0 - не существует.

    Синтаксис: СуществуетФайл(<ИмяФайла>)
    КопироватьФайл
    Копирует файл.

    Синтаксис: КопироватьФайл(<ИмяФайлаИсточника>,<ИмяФайлаПриемника>,<ФлагПерезаписи>)


    Параметры:

    <ИмяФайлаИсточника> - строка с именем файла источника;

    <ИмяФайлаПриемника> - строка с именем файла приемника;

    <ФлагПерезаписи> -:

    0 - существующий файл приемника перезаписать;

    1 - существующий файл приемника не перезаписывать.
    УдалитьФайл
    Удаляет файл.

    Синтаксис: УдалитьФайл(<ИмяФайла>)
    ПереименоватьФайл
    Переименовать/переместить файл.

    Синтаксис: ПереименоватьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>, <ФлагПерезаписи>)
    Параметры:

    <ИмяФайлаИсточника> - строка с именем файла источника;

    <ИмяФайлаПриемника> - строка с новым именем файла;

    <ФлагПерезаписи> -:

    0 - запрещает перемещение файла между дисками и существующий файл приемника не перезаписывается;

    1 - разрешает перемещение файла между дисками (только для файлов) и существующий файл приемника перезаписывается.
    НайтиПервыйФайл
    Открывает выборку файлов по заданной маске и находит первый файл.

    Возвращает строку с именем найденного файла.

    Синтаксис: НайтиПервыйФайл(<МаскаИмени>)
    НайтиСледующийФайл
    Находит следующий файл по открытой выборке файлов.

    Возвращает строку с именем найденного файла.

    Синтаксис: НайтиСледующийФайл()
    АтрибутыФайла
    Возвращает атрибуты файла (в параметрах).
    Синтаксис:

    АтрибутыФайла (<ИмяФайла>, <РазмерФайла>, <АтрибутыФайла>, <ВремяСоздания>, <ВремяПоследнегоДоступа>, <ВремяПоследнейЗаписи>, <РасширенноеИмяФайла>)
    Атрибуты файла закодированы, об этом см. Синтакс-Помощник или описание встроенного языка
    СоздатьКаталог
    Создать новый каталог (папку).

    Синтаксис:СоздатьКаталог(<ИмяКаталога>)
    УдалитьКаталог
    Удаляет каталог файлов.

    Синтаксис: УдалитьКаталог(<ИмяФайла>)
    УстТекКаталог
    Устанавливает текущий каталог файлов.

    Синтаксис: УстТекКаталог(<ИмяФайла>)
    ТекКаталог
    Возвращает строку с именем текущего каталога файлов.
    WindowsКаталог
    Возвращает строку с именем Windows директории. СвободноеМестоНаДиске
    Возвращает размер свободного дискового пространства в байтах.

    Синтаксис: СвободноеМестоНаДиске(<ИмяДиска>)
    Также часто применяются системные функции:

    КаталогИБ
    Возвращает имя каталога базы данных.
    КаталогПользователя
    Возвращает имя каталога пользователя.
    КаталогПрограммы
    Возвращает имя каталога с исполняемыми файлами системы 1С:Предприятие.
    КаталогВременныхФайлов
    Возвращает имя каталога временных файлов.
    ИмяКомпьютера
    Возвращает сетевое имя компьютера, работающего в данный момент с программой.


    Кроме стандартных вышеперечисленных реквизитов, разработчик


    Код
    Полный код счета. Например, "10.1" или "62.5.1"
    Наименование
    Название счета. Например, "Материалы" или "Расч. с бюдж. по НДС"
    Валютный
    Признак ведения валютного учета. 1 - валютный учет ведется, 0 - не ведется
    Количественный
    Признак ведения количественного учета. 1 - количественный учет ведется, 0 - не ведется
    Забалансовый
    Признак забалансового счета. 1 - счет забалансовый, 0 - балансовый
    Активный
    Тип остатка по счету. 1 - счет активный, 2 - счет пассивный, 3 - счет активно-пассивный
    <реквизит>
    Кроме стандартных вышеперечисленных реквизитов, разработчик может задать произвольное количество дополнительных реквизитов. Реквизиты могут быть периодическими, т.е. хранить значение на определенную дату. Например, может быть создан периодический реквизит "Ответственный" типа "Справочник.Сотрудники". Он будет показывать сотрудника, ответственного за ведение данного счета.
    Работа с периодическими реквизитам счета не отличается от работы с периодическими реквизитами справочника.
    Пример, прочитать и установить ответственного за ведение счета:
    Счета = СоздатьОбъект("Счет.ОснПлан");

    Счета.НайтиПоКоду("10.1");

    БылОтветственный = Счета.Ответственный.Получить(НекаяДата);

    Счета.Ответственный.Установить(НекаяДата, ВыбрСотрудник);

    Счета.Записать();
    Можно установить дату выборки периодических реквизитов, тогда ниже уже нельзя применять методы Установить и Получить

    Счета = СоздатьОбъект("Счет.ОснПлан");

    Счета. ИспользоватьДату(НекаяДата);

    Счета.НайтиПоКоду("10.1");

    БылОтветственный = Счета.Ответственный;

    Счета.Ответственный = ВыбрСотрудник;

    Счета.Записать();



    является ли данный счет группой


    ЭтоГруппа()
    Определяет, является ли данный счет группой (может иметь субсчета) или нет.

    Возвращает: 1 - счет является группой; 0 - счет не является группой.
    Пример, вывести все синтетические счета:

    Счета = СоздатьОбъект("Счет.ОснПлан");

    Счета.ВыбратьСчета();

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

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

    ..........Сообщить(Счета.Код + " " + Счета.Наименование);

    ....КонецЕсли;

    КонецЦикла;
    ИспользоватьРодителя(<Счет>)
    Устанавливает / выдает значение родителя (счета вышестоящего уровня), используемого для выборки счетов. Возвращает: значение типа ''Счет'' - текущее значение используемого родителя на момент до исполнения метода.
    Пример, вывести все субсчета счета "10 Материалы":

    Счета = СоздатьОбъект("Счет.ОснПлан");

    Сч10 = СчетПоКоду(10);

    Счета.ИспользоватьРодителя(Сч10);

    Счета.ВыбратьСчета();

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

    .....Сообщить(Счета.Код + " " + Счета.Наименование);

    КонецЦикла;
    Уровень()
    Возвращает уровень вложенности текущего счета. (возвращает 1 - для счета верхнего уровня)
    Пример, вывести все счета в виде дерева:
    Счета = СоздатьОбъект("Счет.ОснПлан");

    Счета.ВыбратьСчета();

    Пока Счета.ПолучитьСчет()=1 Цикл
    отступ = "";

    Для ном = 1 По Счета.Уровень() Цикл

    ....отступ = отступ + " ";

    КонецЦикла;

    Сообщить(отступ + Счета.Код + " " + Счета.Наименование);
    КонецЦикла;
    ПринадлежитГруппе(<Счет>)
    Определяет, является ли текущий счет субсчетом для счета, указанного в качестве параметра метода. Проверка выполняется по всем вышестоящим уровням счета. Возвращает: 1 - текущий счет является субсчетом для счета, указанного в качестве параметра; 0 - не является.
    Пример,

    Сч10 = СчетПоКоду("10");

    СубСч10 = СчетПоКоду("10.5.1");

    Сообщить(СубСч10.ПринадлежитГруппе(Сч10)); //метод вернет 1
    Родитель(<НомерУровня>)
    Возвращает счет вышестоящего уровня для данного счета. <НомерУровня> - число, которое определяет, какого уровня вышестоящий счет должен быть выдан. Если параметр не указан - выдается непосредственный родитель.


    Например, для счета "10.5" этот метод вернет счет с кодом "10".
    КодСубсчета()
    Выдает код счета без кодов счетов вышестоящих уровней.

    Возвращает: строковое значение - код счета без кодов счетов вышестоящих уровней.
    Например, для счета "10.5" этот метод вернет строковое значение "5".
    ВыборГруппы(<флаг>)
    Этот метод утанавливает режим выборки групп. Данный метод может применяться как для позиционируемых объектов, созданных функцией ''СоздатьОбъект'', так и для элементов диалога типа ''Счет''. По умолчанию выбор группы разрешен, за исключением счетов дебета и кредита в проводках операции.
    ВыбрСчет.ВыборГруппы(1); //разрешить выбор группы

    ВыбрСчет.ВыборГруппы(0); //запретить выбор группы


    Вызывается при открытии формы элемента


    ПриОткрытии()
    Вызывается при открытии формы элемента справочника. Можно задать начальные значения для переменных, проверить права пользователя на открытие данного элемента справочника и т.д.
    ПриЗакрытии()
    Вызывается при закрытии формы элемента справочника.
    ПриЗаписи()
    Вызывается при записи элемента справочника. В этой процедуре можно проверить вводимые данные на наличие ошибок.
    Пример, справочник Сотрудники
    Процедура ПриЗаписи

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

    .........Предупреждение("Не указана категория сотрудника!");

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

    .....КонецЕсли;

    КонецПроцедуры
    ВводНового()
    Вызывается при интерактивном вводе нового элемента справочника. В этой процедуре можно проверить права пользователя на создание новых элементов справочника, а также задать начальные значения реквизитов.
    Следует заметить, что вверсии 8.0 список событий всех объектов значительно расширен.



    Этот метод выполняет поиск счета


    НайтиПоКоду(код)
    Этот метод выполняет поиск счета в плане счетов по коду счета, который передается методу в качестве параметра. Если счет найден, метод возвращает 1 и позиционирует объект на выбранном счете.
    НайтиСчет(<счет>)
    Этот метод выполняет поиск счета по значению, заданному параметром <Счет>, и позиционирует объект на выбранном счете.
    Выбран()
    Этот метод возвращает число со значением 1 — если счет выбран (спозиционирован) или значение не пустое, 0 — если не выбран или значение пустое.
    Выбрать()
    Этот метод вызывает на экран диалог, содержащий план счетов. Пользователь должен интерактивно выбрать требуемый счет. Если счет выбран, метод возвращает 1 и позиционирует объект на выбранном счете. Данный метод может использоваться только для объектов, созданных функцией СоздатьОбъект.
    СчетПоКоду(код[,плансчетов])
    Глобальная системная функция. Возвращает счет по коду. Если план счетов не указан, тогда поиск осуществляется в основном плане счетов, заданном в Конфигураторе.
    ОсновнойПланСчетов()
    Глобальная системная функция. Возвращает план счетов, заданный в Конфигураторе в качестве основного.
    Операции и проводки

    Этот метод выполняет поиск счета
    Создание операции и проводок

    Этот метод выполняет поиск счета
    Простой перебор

    Этот метод выполняет поиск счета
    Перебор с фильтром

    Этот метод выполняет поиск счета
    Перебор с корр. счетом

    Этот метод выполняет поиск счета
    Фильтр по субконто

    Этот метод выполняет поиск счета
    Графа отбора

    Этот метод выполняет поиск счета
    Поиск операции

    Этот метод выполняет поиск счета
    Удаление операции и проводок

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

    Операция обычно содержит одну или несколько проводок. Именно проводки влияют на бухгалтерские итоги. Каждая проводка принадлежит одной и только одной операции. Следует помнить, что любая операция вводится на основании документа. Даже операции, введенные вручную, привязываются к документу специального типа "Операция".
    Работа с операциями похожа на работу с документами. Проводки можно представить, как табличную часть операции, по аналогии с табличной частью документа. С точки зрения пользователя все операции и проводки хранятся в журнале операций и связанном с ним журнале проводок.



    Атрибут ДатаОперации содержит дату бухгалтерской


    ДатаОперации
    Атрибут ДатаОперации содержит дату бухгалтерской операции. Так как каждая бухгалтерская операция принадлежит документу (причем только одному, а операция введенная вручную также принадлежит специальному документу «Операция»), значение атрибута совпадает со значением атрибута ДатаДок документа, которому принедлежит операция.
    Содержание
    Атрибут Содержание служит для обращения к содержанию операции. Содержание операции представляет собой произвольную символьную строку. Например, "Поступление материалов".
    СуммаОперации
    Атрибут СуммаОперации служит для обращения к сумме операции. Сумма операции является положительным или отрицательным числом. Сумма операции предназначена лишь для иллюстрирования денежного выражения операции и не влияет на бухгалтерские итоги.
    Документ
    Атрибут Документ является атрибутом «только для чтения», то есть ему нельзя присваивать никакого значения. Он служит для обращения к документу, котрому принадлежит операция. Так, как любая операция принадлежит документу (операция введенная «вручную» принадлежит документу специального вида «Операция») доступ к некоторым свойствам операции, например, номеру возможен только посредством обращения к атрибуту Документ.
    Атрибут Документ предназначен только для доступа к атрибутам и реквизитам документа, которому принадлежит операция. Для получения значения типа «Документ» используется метод ТекущийДокумент.
    Сумма
    Атрибут Сумма служит для обращения к сумме выбранной проводки (корреспонденции) операции.
    Перед обращением к атрибуту конкретной проводки эта проводка должна быть выбрана с помощью методов ВыбратьПроводки, ПолучитьПроводку или создана при помощи метода НоваяПроводка. В модулях форм «Операции» и «Журнал проводок» текущая проводка определяется положением курсора.
    Валюта
    Атрибут Валюта служит для обращения к валюте выбранной проводки или корреспонденции операции. Применяется только для счетов, на которых ведется валютный учет.


    ВалСумма
    Атрибут ВалСумма служит для обращения к сумме в валюте выбранной проводки или корреспонденции операции. Применяется только для счетов, на которых ведется валютный учет.
    Количество
    Атрибут Количество служит для обращению к количеству выбранной проводки или корреспонденции операции. Применяется только для счетов, на которых ведется количественный учет.
    Дебет

    Дебет.Счет

    Дебет.Субконто
    Атрибут Дебет служит для обращения к дебетовой части текущей проводки (корреспонденции) операции. Данный атрибут возвращает агрегатный объект специального типа «Дебет», который используется только для доступа к данным дебетовой части конкретной проводки (корреспонденции) операции и не используется отдельно.
    Атрибут Дебет.Счет служит для доступа к счету дебета/кредита проводки или корреспонденции операции.
    Атрибут Дебет.Субконто служит для доступа к значению субконто дебета проводки (корреспонденции) операции. В конкретном случае обращение к субконто для дебета определяется счетом дебета, то есть заданными для него видами субконто по которым ведется аналитический учет по этому счету.
    Разные варианты обращения к субконто см. выше в примере.
    Кредит

    Кредит.Счет

    Кредит.Субконто
    Доступ к кредитовой части текущей проводки. Работает аналогично атрибуту Дебет.
    <реквизит_операции>
    Помимо реквизитов операции, задаваемых на системном уровне (СуммаОперации, Содержание), в процессе конфигурирования для операции можно создать дополнительные реквизиты для хранения любой необходимой информации. Для обращения к дополнительному реквизиту операции должен быть указан его идентификатор, заданный в конфигураторе.
    <реквизит_проводки>
    Помимо реквизитов проводки, задаваемых на системном уровне (Сумма, Валюта и других), в процессе конфигурирования для проводки можно создать практически неограниченное число дополнительных реквизитов для хранения любой необходимой информации.


    все проводки со счетом 51


    50
    все проводки со счетом 50
    50, *
    все проводки в дебет 50 счета
    * , 51
    все проводки с кредита 51 счета
    50, 51
    все проводки в дебет 50 счета с кредита 51
    51; 52
    все проводки со счетом 51 или счетом 52
    46, 68.2
    все проводки в дебет 46 счета с кредита 68.2
    "бумага"
    все проводки, содержащие в содержании операции или в субконто или в реквизитах слово «бумага»
    "бумага"; "картон"
    все проводки, содержащие в содержании операции или в субконто или в реквизитах слово «бумага» или слово «картон»
    *, 46; "бумага"
    все проводки по кредиту 46 счета, содержащие в содержании операции или в субконто или в реквизитах слово «бумага»
    После вызова метода ВыбратьОперацииСПроводками метод ПолучитьПроводку выбирает очередную проводку из выборки удовлетворяющую заданным условиям, а метод ПолучитьОперацию
    выбирает первую проводку слудующей операции удовлетворяющую заданным условиям.



    Проверить проводку на соответствие корректным


    ПолучитьВремя()

    УстановитьВремя()
    Возвращает / устанавливает время текущей операции.
    ПроверитьПроводку
    Проверить проводку на соответствие корректным проводкам. Список корректных проводок задает пользователь.
    Выбрана()

    ПроводкаВыбрана()
    Проверяет выбранность операции и проводки.
    ПланСчетов()
    Возвращает план счетов текущей проводки.
    ПолучитьДокумент()
    Возвращает документ, которому принадлежит операция.
    ПредставлениеПроводки()

    ПредставлениеСубконто()
    Возвращает строковое представление проводки и субконто, например для вывода в отчет.
    ЗаписатьПроводки()
    Метод ЗаписатьПроводки выполняет запись в информационную базу уже добавленных и заполненных проводок операции. Метод может использоваться только для атрибута «Операция» документа в момент проведения (в процедуре ОбработкаПроведения). При этом происходит обновление бухгалтерских итогов. Это позволяет при проведении документа обращаться к бухгалтерским итогам уже измененным проводками, записанными этим документом. После выполнения метода ЗаписатьПроводки и до окончания процедуры ОбработкаПроведение уже невозможно изменять или удалять проводки, добавленные до вызова этого метода.
    Данный метод имеет смысл использовать, только в том случае, если существует необходимость обращения к итогам, измененным проводками записываемой операции.
    Процедура ОбработкаПроведения()
    Сч20 = СчетПоКоду("20");

    Cч40 = CчeтПoKoдy("40");

    СписаниеСчетаНаСч20(СчетПоКоду("25"));

    СписаниеСчетаНаСч20(СчетПоКоду("26"));

    Операция.ЗаписатьПроводки();

    СписаниеСчета20На40();

    Операция.Содержание = "Закрытие фин. результатов за " + Формат(ДатаДок, "Д ММММГГГГ");

    Операция.Записать();
    КонецПроцедуры
    Бухгалтерские итоги
    Механизм бухгалтерских итогов, поддерживаемый компонентой «Бухгалтерский учет» системы 1С:Предприятие релизует хранение накопленных итогов для обеспечения быстрого обращения к ним при составлении отчетов и выполнения различных вычислений.


    Хранение итогов поддерживается системой с детализацией до месяца. Кроме того, хранятся не все возможные итоги, а те, обращение к которым выполняется наиболее часто — это остатки и обороты по счетам с детализацией по объектам аналитики (субконто), а также обороты между счетам (без учета аналитики). Такие итоги называются основными. Обращение к этим итогам выполняется системой непосредственно. Для получения других итогов (с детализацией меньше месяца, с получением оборотов между различными объектами аналитики, а также сложных выборок) требуется выполнение предварительных действий — временного расчета или запроса.
    Объект «БухгалтерскиеИтоги» может работать в 3-х различных режимах:
  • работа с основными итогами;

  • работа с временными итогами;

  • работа в режиме запроса;

  • При создании объекта он работает в режиме работы с основными итогами. Переключение его в остальные режимы выполняется методами Рассчитать и ВыполнитьЗапрос. В зависимости от режима изменяется состав и использование атрибутов и методов объекта.



    дебетовое сальдо по счету на


    СНД
    дебетовое сальдо по счету на начало периода
    СНК
    кредитовое сальдо по счету на начало периода
    СКД
    дебетовое сальдо по счету на конец периода
    СКК
    кредитовое сальдо по счету на конец периода
    ДО
    дебетовый оборот по счету за период
    КО
    кредитовый оборот по счету за период
    Синтаксис (у всех одинаковый): СНД (<Счет>, <ТипСуммы>, <Валюта>, <Субконто1>...)

    <Счет>
    Значение типа «Счет» — счет расчета итогов. Может использоваться строка — код счета.
    <ТипСуммы>
    Необязательный параметр. Число или строка — тип возвращаемой суммы. Может принимать одно из следующих значений:
  • 1 ("С") — сумма;

  • 2 ("В") — валютная сумма;

  • 3 ("К") — количество.

  • Если параметр не указан, метод возвращает сумму.
    <Валюта>
    Необязательный параметр. Значение типа «Справочник.Валюты». Если параметр не указан итоги выдаются без учета валюты. Если указана валюта, то данные выдаются по конкретной валюте. Валютная сумма может выдаваться только по конкретной валюте.
    <Субконто1>

    <Субконто2>

    ...…
    Необязательный параметр. Значения субконто. Их количество зависит от настройки субконто для данного счета. Если параметры не указаны, итоги выдаются без учета аналитики.
    Пример
    БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги);

    ОстатокНаСчетеНаНачалоПериода = БухИтоги.СНД("51");

    ОстатокНаСчетеНаКонецПериода = БухИтоги.СКД("51");
    ПриходГвоздейНаСкладЗаПериод = БухИтоги.ДО("10.1",3,,МатериалГвозди,ЦентрСклад);



    счет расчета итогов. Может использоваться


    <Счет>
    Значение типа «Счет» — счет расчета итогов. Может использоваться строка — код счета.
    <ТипСуммы>
    Необязательный параметр. Число или строка — тип возвращаемой суммы. Может принимать одно из следующих значений:
  • 1 ("С") — сумма;

  • 2 ("В") — валютная сумма;

  • 3 ("К") — количество.

  • Если параметр не указан, метод возвращает сумму.
    <Валюта>
    Необязательный параметр. Значение типа «Справочник.Валюты». Если параметр не указан итоги выдаются без учета валюты. Если указана валюта, то данные выдаются по конкретной валюте. Валютная сумма может выдаваться только по конкретной валюте.
    <Субконто1>

    <Субконто2>

    ...…
    Необязательный параметр. Значения субконто. Их количество зависит от настройки субконто для данного счета. Если параметры не указаны, итоги выдаются без учета аналитики.
    Пример
    БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги);

    ОстатокНаСчетеНаНачалоПериода = БухИтоги.СНД("51");

    ОстатокНаСчетеНаКонецПериода = БухИтоги.СКД("51");
    ПриходГвоздейНаСкладЗаПериод = БухИтоги.ДО("10.1",3,,МатериалГвозди,ЦентрСклад);



    дебетовое развернутое сальдо по субсчетам


    СНДР
    дебетовое развернутое сальдо по субсчетам на начало периода
    СНКР
    кредитовое развернутое сальдо по субсчетам на начало периода
    СКДР
    дебетовое развернутое сальдо по субсчетам на конец периода
    СККР
    кредитовое развернутое сальдо по субсчетам на конец периода
    Пример
    * Для помещения в бухгалтерский баланс вычисляется развернутое сальдо по 68 счету, учет на котором ведется на субсчетах. Дебетовая составляющая должна попасть в актив баланса, кредитовая составляющая — в пассив.
    БухИтоги = СоздатьОбъект( "БухгалтерскиеИтоги);

    ДебСальдоНаНач = БухИтоги.СНДР("68");

    ДебСальдоНаКон = БухИтоги.СКДР("68");

    КрСальдоНаНач = БухИтоги.СНКР("68");

    КрСальдоНаКон = БухИтоги.СККР("68");



    дебетовое развернутое сальдо по субконто


    СНДРС
    дебетовое развернутое сальдо по субконто на начало периода
    СНКРС
    кредитовое развернутое сальдо по субконто на начало периода
    СКДРС
    дебетовое развернутое сальдо по субконто на конец периода
    СККРС
    кредитовое развернутое сальдо по субконто на конец периода
    Синтаксис (у всех одинаковый):
    СНДРС(<Счет>, <ТипСуммы>, <Валюта>, <Субконто1>, <ТипФильтра1>, <Субконто2>, <ТипФильтра2>...)
    <ТипФильтра>. Необязательный параметр. Тип использования субконто. (Строка или число).
  • "*" (1) — Разворачивать по данному субконто.

  • "!" (2) — Отбирать по данному субконто.

  • " " (3) — Не учитывать данное субконто.

  • Значения по умолчанию: "*" (1) — для первого субконто, " " (3) — для остальных субконто.
    Пример
    //Получим развернутое сальдо дебетовое на начало периода по счету 60,

    // учет ведется по субконто Организации.
    СР60 = БухИтоги.СНДРС("60");
    //Получим развернутое сальдо дебетовое на начало периода по счету 10

    //конкретному складу в разрезе материалов, учет ведется по субконто «Материалы» и «Склады».
    СР10 = БухИтоги.СНДРС("10", 1, , , "*", ВыбСклад, "!");

    ПериодД
    Устанавливает произвольный период в качестве периода расчета итогов.

    Синтаксис: ПериодД(<ДатаНачалаПериода>, <ДатаКонцаПериода>)
    ПериодКВ
    Устанавливает квартал в качестве периода расчета итогов.

    Синтаксис: ПериодКВ(<Дата>|<НомерКвартала>, <Год>)
    ПериодКВН
    Устанавливает в качестве периода расчета итогов период с начала года до конца указанного квартала.

    Синтаксис: ПериодКВН(<Дата>|<НомерКвартала>, <Год>)
    ПериодМ
    Устанавливает в качестве периода расчета итогов месяц.

    ПериодМ(<Дата>|<НомерМесяца>, <Год>)
    ПериодМНК
    Устанавливает в качестве периода расчета итогов период с начала квартала до конца указанного месяца.

    ПериодМНК(<Дата>|<НомерМесяца>, <Год>)
    ПериодМНГ
    Устанавливает в качестве периода расчета итогов период с начала года до конца указанного месяца.

    ПериодМНГ(<Дата>|<НомерМесяца>, <Год>)
    НачПериода
    Возвращает начальную дату установленного в данный момент периода основных итогов.
    КонПериода
    Выдает конечную дату установленного в данный момент периода основных итогов.


    Необязательный параметр. Выражение типа дата,


    <НачалоПериода>
    Необязательный параметр. Выражение типа дата, документ или позиция документа начала периода расчета временных итогов. Если этот параметр не указан, будут вычисляться конечные сальдо на момент, указанный в параметре <КонецПериода>.
    <КонецПериода>
    Необязательный параметр. Выражение типа дата, документ или позиция документа конца периода расчета временных итогов. Если этот параметр не указан, будут вычисляться начальные сальдо на момент, указанный в параметре <НачалоПериода>.
    Если из двух параметров периода задан только параметр начала периода, метод Рассчитать вычислит начальные остатки — без оборотов. Наоборот, если задан параметр конца периода, будут вычисленные конечные остатки.
    <ФильтрП, рСчетам>
    Необязательный параметр. Счета, для которых будет выполняться временный расчет итогов. Задается значением типа «Счет» или объектом типа «СписокЗначений», содержащим значения типа «Счет», либо строкой содержащей список кодов счетов, разделенных символом ", " или ";".
    <ТолькоСинтетика>
    Необязательный параметр:
    1 — рассчитывать сальдо только по счетам;

    0 — или не указан — рассчитывать сальдо по счетам и по субконто.
    Установка параметра <ТолькоСинтетика> в 1 задает выполнение расчета итогов только по счетам, без субконто. В этом случае функции для получения развернутого сальдо по субконто СНДРС, СКДРС, СНКРС, СККРС для счетов, по которым ведется аналитический учет по субконто будут возвращать 0, даже если реально в информационной базе есть остатки по этим счетам.
    Если параметр <ТолькоСинтетика> не указан или равен 0, временный расчет итогов будет выполнен и по счетам, и по субконто.
    <ПланСчетов>
    Необязательный параметр. Ограничение расчета одним планом счетов.
    <РазделительУчета>
    Необязательный параметр. Значение разделителя учета. Ограничение расчета одним значением разделителя учета.


    Этот метод возвращает уровень текущего


    Уровень()
    Этот метод возвращает уровень текущего элемента. Например, для сотрудника, который находится в группе Работающие, мы получим число 2.
    Пример, вывод иерархического справочника в виде дерева:
    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

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

    Пока СпрСотр.ПолучитьЭлементы()=1 Цикл
    //вывести отступ в соответствии с глубиной вложенности элемента

    Для Ном=1 По СпрСотр.Уровень() Цикл

    .....Сообщить(".....");

    КонецЦикла;

    Сообщить(СпрСотр.Наименование);
    КонецЦикла;
    ЭтоГруппа()
    Этот метод возвращает 1, если текущий элемент справочника является группой, или 0 если группой не является.
    Пример, вывод сотрудников (группы не выводятся):
    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

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

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

    ......Продолжить; //группы пропускаем, перейти в начало цикла

    КонецЕсли;

    Сообщить(СпрСотр.Наименование);
    КонецЦикла;
    ПринадлежитГруппе(...)
    Метод проверяет, принадлежит ли указанной группе текущий элемент справочника (независимо от того, на каком нижележащем уровне он находится).

    Возвращает: 1 - если элемент принадлежит указанной группе , 0 - если нет.
    Пример, вывод товаров, принадлежащих к группе Спиртное, независимо от того входят ли они в подгруппы Шампанское, Пиво, Водка, Вино и т.д.:
    СпрТовары = СоздатьОбъект("Справочник.Товары");

    СпрТовары.ВыбратьЭлементы();

    Пока СпрТовары.ПолучитьЭлементы()=1 Цикл
    Если СпрТовары.ПринадлежитГруппе(грпСпиртное)=1 Тогда

    .....Сообщить(СпрТовары.Наименование);

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

    СпрТовары.ВыбратьЭлементы();

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




    Если СпрТовары.ПринадлежитГруппе(грпСпиртное)=1 Тогда

    .....СпрСотр.Родитель = грпРаспродажа;

    .....СпрСотр.Записать();

    КонецЕсли;
    КонецЦикла;
    А можно сделать красивее и перенести всю группу Спиртное в группу Распродажа, тогда все подгруппы и элементы также перенесутся в группу Распродажа.
    СпрТовары = СоздатьОбъект("Справочник.Товары");

    СпрТовары.НайтиЭлемент(грпСпиртное);

    СпрТовары.Родитель = грпРаспродажа;

    СпрТовары.Записать();
    ПолныйКод()
    Возвращает строку, содержащую полный код выбранного элемента справочника со всеми вышестоящими уровнями, разделенными символом "/".
    Например, "2/7/123"
    ПолноеНаименование()
    Возвращает строку, содержащую полное наименование выбранного элемента справочника со всеми вышестоящими уровнями, разделенными символом "/".
    Например, "Спиртное/Шампанское/Советское"

    Необязательный параметр. Выражение типа дата,


    <НачалоПериода>
    Необязательный параметр. Выражение типа дата, документ или позиция документа начала периода запроса. Если этот параметр не указан, будут вычисляться начальные сальдо на момент, указанный в параметре <КонецПериода>
    <КонецПериода>
    Необязательный параметр. Выражение типа дата, документ или позиция документа конца периода запроса. Если этот параметр не указан, будут вычисляться начальные сальдо на момент, указанный в параметре <НачалоПериода>.
    <ФильтрПоСчетам>
    Необязательный параметр. Счета, для которых будут отбираться итоги в запросе. Задается значением типа «Счет» или объектом типа «Список-Значений», содержащим значения типа «Счет», либо строкой содержащей список кодов счетов, разделенных символом ", " или ";". Если параметр не указан, отбор будет выполняться по всем счетам.
    <ФильтрПоКоррСчет>
    Необязательный параметр. Значение типа «Счет» — корреспондирующий счет, в корреспонденции с которым будут отбираться итоги счета, указанного в параметре <ФильтрПоСчетам>. Задается значением типа «Счет» или объектом типа «СписокЗначений», содержащим значения типа «Счет», либо строкой содержащей список кодов счетов, разделенных символом "," или ";". Если параметр не указан, будут отбираться итоги в корреспонденции со всеми счетами.
    <Валюта>
    Необязательный параметр. Значение типа «Справочник.Валюты». Если параметр не указан итоги выдаются без учета валюты.
    <ТипИтогов>
    Необязательный параметр. Число — тип отбираемых итогов. Может принимать следующие значения:
  • 1 — остатки и обороты по счету в целом (по умолчанию);

  • 2 — обороты между счетами;

  • 3 — Первое и второе вместе.

  • <Периодичность>
    Необязательный параметр. Позволяет получить дополнительный разрез итогов по периодам. Число или символьная строка. По умолчанию периодичность не задана. Параметр <Периодичность> может принимать следующие значения:


    ния сальдо по субсчетам основного


    <ФлагСчета>
    Необязательный параметр. Признак развертыва ния сальдо по субсчетам основного счета. Число:
  • 0 — не разворачить по субсчетам (по умолчанию);

  • 1 — разворачивать по субсчетам;

  • -1 (минус единица) — не выдавать итоги по счетам-группам.

  • <ФлагКоррСчета>
    Необязательный параметр. Признак развертывания сальдо по субсчетам корреспондирующего счета. Число:
  • 0 — не разворачить по субсчетам (по умолчанию);

  • 1 — разворачивать по субсчетам;

  • -1 (минус единица) — не выдавать итоги по корреспондирующим счетам-группам.



  • ных итогов будет выполнен только


    <ВидСубконто>
    Значение типа «Вид Субконто» — расчет времен ных итогов будет выполнен только для субконто указанного вида. Задается значением типа «Вид Субконто» или строкой содержащей имя идентификатора вида субконто, как он назван в конфигураторе.
    <Субконто>
    Необязательный параметр. Здесь может быть задано или одно конкретное значение субконто, по которому будут отобраны итоги по аналитике или объект типа «Список значений», где можно задать несколько значений субконто. Если параметр не задан — то считается пустым значением субконто.
    <ТипФильтра>
    Необязательный параметр. Число — тип фильтра по субконто. Может принимать следующие значения:
  • 1 — разворачивать по данному субконто (по умолчанию),

  • 2 — отбирать по данному субконто,

  • 3 — не учитывать это субконто вообще.

  • <ПоГруппам>
    Необязательный параметр. Число — группировка др итогов по субконто. Параметр <ПоГруппам> имеет смысл, если параметр <ТипФильтра> равен 1, а вид субконто, заданный параметром <ВидСубконто>, имеет тип значения «Справочник». Параметр может принимать значения:
  • 0 — не показывать итоги по группам справочника (по умолчанию);

  • 1 — показывать итоги по группам справочника.

  • Пример:
    * Данный запрос формирует итоги по счету 10 в разрезе материалов по одному складу.
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Материалы, , 1);

    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Склады, ВыбСклад, 2);

    БухИтоги.ВыполнитьЗапрос(ДатаНач, ДатаКон, "10");



    Синтаксис: ВыбратьСчета


    ВыбратьСчета

    ПолучитьСчет
    Синтаксис: ВыбратьСчета(<ФлагВсе>, <ФлагДК>, <Номер>, <РазвСальдо>)
    <ФлагВсе>
    Необязательный параметр.
  • 0 — отбирать те счета, которые имели итоги на этом уровне обхода итогов запроса (по умолчанию);

  • 1 — включить в выборку все счета, которые имели итоги в данном запросе;

  • -1, -2 ... — включить в выборку счета, которые имели итоги в группировке n-го вышестоящего уровня.

  • <ФлагДК>
    Необязательный параметр.
  • 1 — включать в выборку счета только с дебетовыми оборотами;

  • 2 — включать в выборку счета только с кредитовыми оборотами.

  • 0 — включать в выборку счета вне зависимости от дебетовых/кредитовых оборотов (по умолчанию).

  • <Номер>
    Необязательный параметр. Положительное целое число — номер выборки. Если параметр не указан, выборке присваивается номер 0.

    Выборке, открываемой методом ВыбратьСчета, может быть присвоен номер — положительное целое число. Номер — это «метка» выборки. Номер может использоваться для обращения к результатам выборки при помощи метода ПолучитьСчет. Использование этой метки необходимо, если требуется получить две группировки по счету.
    <РазвСальдо>
    Необязательный параметр. Признак необходимости рассчитывать развернутое сальдо по субконто. Используется только если в запросе участвуют субконто.
  • 1 — рассчитывать развернутое сальдо.

  • 0 — не рассчитывать развернутое сальдо (по умолчанию);

  • Синтаксис: ПолучитьСчет(<Номер>, <Счет>)

    <Номер>
    Необязательный параметр. Положительное целое число — номер выборки. Если раньше было открыто несколько выборок по счету.
    <Счет>
    Необязательный параметр. Конкретное значение счета, которое нужно получить из выборки.
    Пример.
    БухИтоги.Запрос(Дата1, Дата2);

    БухИтоги.ВыбратьСчета();

    Пока БухИтоги.ПолучитьСчет() = 1 Цикл
    Деб = БухИтоги.ДО();

    Кред = БухИтоги.КО();
    КонецЦикла;
    ВыбратьКорСчета

    ПолучитьКорСчет
    Синтаксис

    ВыбратьКорСчета(<ФлагВсе>, <ФлагДК>, <Номер>)

    ПолучитьКорСчет(<Номер>, <Счет>)
    Пример:
    БухИтоги.Запрос(Дата1, Дата2);

    БухИтоги.ВыбратьСчета();

    Пока БухИтоги.ПолучитьСчет() = 1 Цикл
    БухИтоги.ВыбратьКорСчета();

    Пока БухИтоги.ПолучитьКорСчет() = 1 Цикл
    Деб = БухИтоги.ДО();

    Кред = БухИтоги.КО();
    КонецЦикла;
    КонецЦикла;
    ВыбратьВалюты

    ПолучитьВалюту
    Синтаксис:

    ВыбратьВалюты(<ФлагВсе>, <ФлагДК>, <Номер> , <РазвСальдо>, <Сортировка>)

    ПолучитьВалюту(<Номер>, <Валюта>)
    Пример:
    БухИтоги.Запрос(Дата1, Дата2);

    БухИтоги.ВыбратьСчета();

    Пока БухИтоги.ПолучитьСчет() = 1 цикл
    БухИтоги.ВыбратьВалюты();

    Пока БухИтоги.ПолучитьВалюту() = 1 цикл
    ДебВ = БухИтоги.ДО(2);

    КредВ = БухИтоги.КО(2);
    КонецЦикла;
    КонецЦикла;
    ВыбратьПериоды

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

    ВыбратьПериоды(<ФлагВсе>, <ФлагДК>, <Номер>, <РазвСальдо>)

    ПолучитьПериод(<Номер>, <ДатаНачалаПериода>)
    Пример:
    БухИтоги.ВыполнитьЗапрос(Дата1, Дата2, , , , , "Месяц");

    БухИтоги.ВыбратьСчета();

    Пока БухИтоги.ПолучитьСчет() = 1 цикл
    БухИтоги.ВыбратьПериоды();

    Пока БухИтоги.ПолучитьПериод() = 1 цикл
    Деб = БухИтоги.ДО();

    Кред = БухИтоги.КО();
    КонецЦикла;
    КонецЦикла;
    ВыбратьСубконто

    ПолучитьСубконто
    Синтаксис:

    ВыбратьСубконто(<Индекс>, <ФлагВсе>, <ФлагДК>, <Номер>, <РазвСальдо>, <Сортировка>, <ПорядокОбхода>)

    ПолучитьСубконто(<Индекс>, <Номер>, <Субконто>)


    Пример:
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Материалы, , 1);

    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Склады, , 1);

    БухИтоги.ВыполнитьЗапрос(ДатаНач, ДатаКон, "10");

    БухИтоги.ВыбратьСубконто(1);

    Пока БухИтоги.ПолучитьСубконто(1) = 1 цикл
    БухИтоги.ВыбратьСубконто(2);

    Пока БухИтоги.ПолучитьСубконто(2) = 1 цикл
    Деб = БухИтоги.ДО();

    Кред = БухИтоги.КО();
    КонецЦикла;
    КонецЦикла;
    ВыбратьКорСубконто

    ПолучитьКорСубконто
    Синтаксис:

    ВыбратьКорСубконто(<Индекс>, <ФлагВсе>, <ФлагДК>, <Номер>, <РазвСальдо>, <Сортировка>, <ПорядокОбхода>)

    ПолучитьКорСубконто(<Индекс>, <Номер>, <Субконто>)
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Товары, , 1);

    БухИтоги.ИспользоватьКорСубконто(ВидыСубконто.Клиенты, , 1);

    БухИтоги.ВыполнитьЗапрос(ДатаНач, ДатаКон);

    БухИтоги.ВыбратьСубконто();

    Пока БухИтоги.ПолучитьСубконто() = 1 цикл
    БухИтоги.ВыбратьКорСубконто();

    Пока БухИтоги.ПолучитьКорСубконто() =1 цикл
    Деб = БухИтоги.КорДО();

    Кред = БухИтоги.КорКО();
    КонецЦикла;
    КонецЦикла;


    Текущий корр. счет, выбранный функцией


    Счет
    Текущий счет, выбранный функцией ПолучитьСчет
    КорСчет
    Текущий корр. счет, выбранный функцией ПолучитьКорСчет
    Валюта
    Текущая валюта, выбранная функцией ПолучитьВалюту
    НачДата

    КонДата
    Начальная и конечная дата текущего периода, выбранного функцией ПолучитьПериод
    Операция
    Атрибут позволяет обращаться к текущей операции, если запрос получен с детализацией итогов по периоду «Операция» и «Проводка».

    Субконто

    КорСубконто

    ПредставлениеСубконто

    ПредставлениеКорСубконто
    Синтаксис

    Субконто(<Номер> | <ВидСубконто>)

    КорСубконто(<Номер> | <ВидСубконто>)
    Пример
    БухИтоги.ИспользоватьСубконто(ВидыСубконто.Товары, , 1);

    БухИтоги.ВыполнитьЗапрос(ДатаНач, ДатаКон);

    БухИтоги.ВыбратьСубконто();

    Пока БухИтоги.ПолучитьСубконто() = 1 цикл

    ......... Сообщить(БухИтоги.Субконто());

    КонецЦикла;
    ЭтоГруппа
    Для тех субконто, которые выбираются из иерархических справочников метод возвращает 1, если текущее значение является группой справочника.
    СНД

    СНК

    СКД

    СКК

    ДО

    КО
    СНД — дебетовое сальдо на начало периода;

    СКД — дебетовое сальдо на конец периода;

    СНК — кредитовое сальдо на начало периода;

    СКК — кредитовое сальдо на конец периода;

    ДО — дебетовый оборот за период;

    КО — кредитовый оборот за период.
    Синтаксис (у всех одинаковый): СНД(<ТипСуммы>)
    Параметр <ТипСуммы> может принимать следующие значения:
  • 1 ("С") - сумма (по умолчанию)

  • 2 ("В") - валютная сумма

  • 3 ("К") - количество

  • СНДРС

    СКДРС

    СНКРС

    СККРС
    СНДРС — дебетовое развернутое сальдо на начало периода;

    СКДРС — дебетовое развернутое сальдо на конец периода;

    СНКРС — кредитовое развернутое сальдо на начало периода;

    СККРС — кредитовое развернутое сальдо на конец периода;
    КорДО

    КорКО
    Возвращает дебетовый или кредитовый оборот между корреспондирующими счетами или субконто.
    ВыбранаПоДт

    ВыбранаПоКт
    Эти функции возвращают 1, если выбран итог по дебету / кредиту.
    Простая бухгалтерия

    Текущий корр. счет, выбранный функцией
    Глава 1

    1. Постановка задачи.

    2. Реализация.

    2.1 Создание конфигурации.

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

    2.3 Справочник Сотрудники.

    2.4 Справочник фирм.

    2.5 Справочник валют.

    2.6 Справочник контрагентов.

    2.7 Работа со справочником контрагентов.

    2.8 Производственная деятельность фирмы.

    2.9 Справочник НДС.
    В этой главе мы наколдуем основные справочники, касающиеся внешних сущностей: контрагентов, валют и т.д.
    Текущий корр. счет, выбранный функцией
    Глава 3

    2.10 Справочник Комплектующие.

    2.11 Справочник Изделия.

    2.12 Справочник Комплектация.

    2.13 Работа со справочниками Изделия и Комплектация.

    2.14 Справочник Склады.

    2.15 Документооборот.
    В этой главе мы сотворим основные справочники, касающиеся производственной деятельности фирмы.
    Текущий корр. счет, выбранный функцией
    Глава 4

    2.16 Определение состава плана счетов.

    2.17 Определение перечня субконто.

    2.18 Субконто МестоХранения.

    2.19 Субконто Комплектующее.

    2.20 Субконто ВидЗатрат.

    2.21 Субконто Изделие.

    2.22 Субконто Сотрудник.

    2.23 Субконто Контрагент.

    2.24 Субконто по документам.

    2.25 Создание Плана счетов.
    В этой главе мы произведем настройку плана счетов и укажем всю необходимую аналитику по счетам (субконто)..
    Текущий корр. счет, выбранный функцией
    Глава 5

    2.26 Документ Операция.

    2.27 Операция сама по себе.

    2.28 Объект Проводки.

    2.29 Снова Операция.
    Почти в любой автоматизированной системе следует оставлять доступ человеку для ручного изменения данных. Заранее предусмотреть все невозможно, поэтому бухгалтер должен всегда иметь возможность сделать произвольную проводку.
    Текущий корр. счет, выбранный функцией
    Глава 6

    2.30 Документы. Общая часть.

    2.31 Документ УчетНДС.

    2.32 Работа с документом УчетНДС.

    2.33 Документ ПриходнаяНакладная.

    2.34 Работа с документом ПриходнаяНакладная.

    2.35 Документ РасходныйОрдер.

    2.36 Отчет по 60 счету
    Документы обеспечивают ввод сведений о фактах и событиях реального мира и генерируют проводки. В этой главе мы сделаем первый отчет, берущий данные с бухгалтерских счетов.
    Текущий корр. счет, выбранный функцией
    Глава 7

    2.37 Документ НарядНаСборку.

    2.38 Документ НакладнаяНаВыпуск.

    2.39 Документ РасходнаяНакладная.

    2.40 Документ ПриходныйОрдер.

    2.41 Документ Ведомость.
    В этой главе мы создадим документы, касающиеся производственной деятельности фирмы.
    Текущий корр. счет, выбранный функцией
    Глава 8

    2.42 Отчет по остаткам на складе готовой продукции.

    2.43 Отчет по покупателям.

    2.44 Новые счета в плане счетов.

    2.45 Совсем другая история.
    Отчеты позволяют получить полную и целостную картину в различных разрезах.

    Глава 1
    1. Постановка задачи.
    Написать простейшую конфигурацию по учету хозяйственных операций для производственной фирмы. Условия:
  • Производство готовых изделий из покупных комплектующих путем сборки;

  • Учет НДС, прочие налоги и сборы не учитываем;

  • Учет заработной платы, работников непосредственно занятых в производстве (оплата сдельная);

  • Четыре типа документов по движению заготовок, готовых изделий и товаров (приходная накладная, наряд на сборку, накладная на выпуск из производства и расходная накладная), два по движению денег (приходный ордер, расходный ордер), один по выплате заработной платы (ведомость) и один по учету НДС;

  • Валюта учета одна;

  • Учет по FIFO;

  • Задача будет решена на базе платформы 1С:Предприятие 7.7.
    Крайне полезным, перед изучением сего опуса, будет полистать мой первый шедевр "Построение простейшей конфигурации по учету складских операций". Все сокращения, условные обозначения и т.д и т.п. описаны там.
    2. Реализация.
    2.1 Создание конфигурации.
    Для начала создадим пустую конфигурацию и укажем основные настройки. Как это сделать – см. мою методичку "Построение простейшей конфигурации по учету складских операций". Конфигурацию поместим в каталог (для определенность "Study_2").
    Настроим свойства задачи:

    На закладке "Общие"
  • Идентификатор – Производство 1.0;

  • Синоним – Производство;

  • Комментарий – учебная конфигурация;

  • На закладке "Задача"
  • Основной язык – Русский;

  • Округление – 1.5 до 2

  • Разрешить непосредственное удаление объектов – Да;

  • На закладках "Автор" и "Заставка" через [Изменить] вносим разную дополнительную информацию и добавляем заставку и логотип (если есть что добавлять);
    2.2 Создание пользователя.
    Создаем пользователя "Программист" (см. методичку "Построение простейшей конфигурации по учету складских операций"). Пароль давать не будем. Интерфейс Администратора мы будем создавать автоматически, по мере ввода новых объектов метаданных, если, конечно, будем пользоваться при их создании конструкторами, но можем и в ручном режиме;


    Глава 2
    2.3 Справочник Сотрудники.
    На фирме, что мы описываем будет кто-то работать (или дурака валять, но это кому как нравится). Заведем списочек этих работничков. Для списка создадим справочник. В поле Код будем хранить табельный номер, а в Наименовании – ФИО сотрудника. Сведем структуру справочника в таблицу, как это делалось в предыдущей методичке.

    Идентификатор: Сотрудники

    Подчинен: нет

    Количество уровней: 1

    Код: 5 Тип кода: число Серии кодов: подчинение

    Наименование: 50

    Основное представление: наименование

    Группы сверху: да

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

    Одна форма для элемента и группы?: нет

    Редактировать: в списке

    "Код" – табельный номер.

    "Наименование" – ФИО сотрудника.
    Реквизит
    Описание
    ТипЗначения
    Доп.
    Исп.
    Изм.

    Создаем новый справочник;
    Текущий корр. счет, выбранный функцией

  • Создадим форму списка;

  • Переименуем поле "Код" в "Таб. №", а поле "Наименование" в "ФИО"

  • Перейдем в 1С:Предприятие и заполним список сотрудников:




  • и конечные результаты расчета зарплаты


    Ведомость на зарплату
    Предназначен для кассира и показывает сумму "на руки" по каждому сотруднику.
    Лицевые счета
    Показывает промежуточные и конечные результаты расчета зарплаты по всем сотрудникам. Можно задать фильтр по категории и/или подразделению.
    Расчетные листочки
    Показывает промежуточные и конечные результаты расчета зарплаты по конкретному сотруднику. Расчетный листочек выдается сотруднику перед выдачей зарплаты для ознакомления. Можно распечатать листочек только для указанного сотрудника или по всем сотрудникам сразу. Можно задать фильтр и/или группировку по категории и подразделению.
    Свод
    Показывает сводные результаты расчета с различной группировкой. Строка отчета соответствует виду расчета или группе расчетов. Колонка отчета соответствует категории или подразделению. По строке подводится итог. Можно задать фильтр по категории и/или подразделению.
    Поиск вида расчета
    Позволяет выбрать всех сотрудников с определенным видом расчета или группой расчетов. Пользователь может задать фильтр по категории и/или подразделению. Можно задать любой период и при необходимости разбить его по месяцам. Есть возможность вывести дополнительные графы по сотруднику.


    Этот атрибут содержит владельца текущего


    атрибут Владелец
    Этот атрибут содержит владельца текущего элемента подчиненного справочника, т.е. элемент справочника-хозяина, к которому относится данный элемент. Атрибут доступен для чтения и записи.
    Пример, перенос всех договоров от одного котрагента к другому (справочник Договоры подчинен справочнику Контрагенты):
    СпрДоговоры = СоздатьОбъект("Справочник.Договоры");

    СпрДоговоры.ИспользоватьВладельца(Контрагент1);

    СпрДоговоры.ВыбратьЭлементы();

    Пока СпрДоговоры.ПолучитьЭлементы()=1 Цикл
    СпрДоговоры.Владелец = Контрагент2;

    СпрДоговоры.Записать();
    КонецЦикла;


    Установить или считать текущее название


    Вид()
    Установить или считать текущее название вида справочника. Возвращает текущее название вида справочника, как оно задано в Конфигураторе, например "Сотрудники". Установка вида справочника возможна для реквизитов типа "Справочник", т.е. справочник неопределенного вида.
    ПредставлениеВида()
    Получить пользовательское представление вида справочника, как он задан в конфигураторе.

    Возвращает строковое значение, содержащее пользовательское представление вида справочника (синоним).
    УстановитьАтрибут(ИмяРеквизита, Значение)
    Установить значение реквизита по его имени.

    <ИмяРеквизита> - строковое выражение, содержащее имя реквизита, как оно задано в конфигураторе. <Значение> - выражение, содержащее устанавливаемое значение реквизита.
    ПолучитьАтрибут(ИмяРеквизита)
    Получить значение реквизита по его имени. Возвращает значение реквизита.
    Выбран()
    Возвращает 1 - если элемент справочника выбран, 0 - если не выбран. Часто применяется для проверки на ошибки, чтобы все необходимые данные были указаны.
    Выбрать(...)
    Вызов диалога для выбора элемента справочника.

    Возвращает: 1 - если элемент выбран; 0 - если не выбран. Выбранный элемент становится текущим.


    Установить значение реквизита по его


    УстановитьАтрибут(ИмяРеквизита, Значение)
    Установить значение реквизита по его имени.

    <ИмяРеквизита> - строковое выражение, содержащее имя реквизита, как оно задано в конфигураторе. <Значение> - выражение, содержащее устанавливаемое значение реквизита.
    ПолучитьАтрибут(ИмяРеквизита)
    Получить значение реквизита по его имени. Возвращает значение реквизита.


    Срабатывает при установке отбора кнопкой


    ПриУстановкеОтбора()
    Срабатывает при установке отбора кнопкой на панели инструментов или выбором закладки отбора. Здесь можно проверить права доступа или сделать что-нибудь еще.
    ПриУстановкеИнтервала()
    Предопределенная процедура при установке интервала журнала.
    ПриВыбореСтроки(ФлагОбработки)
    Срабатывает при двойном щелчке на документе или при нажатии ENTER. Режим обработки выбора строки предопределенной процедурой ПриВыбореСтроки включается при помощи метода Форма.ОбработкаВыбораСтроки(1).
    Сортировка

    ВНИМАНИЕ. Сортировка в журнале документов по произвольной графе невозможна!
    Поиск документа в журнале

    Кнопка "Поиск по номеру" (см. панель инструментов формы журнала документов) + набор первых символов.



    В теле описываются подготовка данных


    ОбработкаПроведения(Знач)
    Обработка проведения. В теле описываются подготовка данных реквизитов документа, бухгалтерских итогов к формированию операции, а также свойства этой операции (Корреспондирующие счета, Субконто и т.п.). Здесь же описываются движения регистров оперативного учета, если документ в них участвует. Выполнение проведения система самостоятельно заключает в транзакцию, поэтому не употребляйте операторов, ожидающих отклика пользователя и, вообще, постарайтесь минимизировать подготовку проведения, передав, по возможности, часть этой работы в модуль формы. В переменную Знач передается значение, указанное в методе Провести() при его работе. Параметр не обязательный.
    ОбработкаУдаления Проведения()
    При отмене проведения документа (удалении проведенного документа) системой автоматически удаляются его проводки и движения регистров. Тем не менее, если при проведении совершались еще какие-то действия, то отменять их нужно в теле данной процедуры. Например, если при проведении исходя из бухгалтерских итогов рассчитывалась построчная итоговая сумма, то при распроведении её нужно очищать:
    Процедура ОбработкаУдаленияПроведения()
    Если ВыбратьСтроки() = 1 Тогда // Обратите внимание
    Пока ПолучитьСтроку() = 1 Цикл
    Сумма = 0; // Сумма - реквизит документа ***
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
    *** Пример доступности контекста документа в модуле документа
    АрхивироватьДокумент()
    Вызывается при смене расчетного периода журнала расчетов "вперед". Требуется описывать, если документ порождает записи журнала расчетов.
    2.
    Модуль формы запускается при каждом открытии формы документа. В его контексте доступны все реквизиты документа и реквизиты формы. Кроме предопределенных процедур модуля формы, там можно разместить вспомогательные процедуры и функции, вызываемые, например, экранными кнопками. Не путайте: предопределенные процедуры модуля документа нельзя размещать в модуле формы, и наоборот!



    Вызывается при создании интерактивном создании


    ВводНового(ПризнакКопирования, ОбъектКопирования)
    Вызывается при создании интерактивном создании нового документа пользователем. Процедура обычно содержит предустановки значений некоторых реквизитов при создании нового документа или операторы управления видом экранной формы. ПризнакКопирования - имя переменной, которую система установит в "0", если введен просто новый документ, и в "1", если документ скопирован (через F9, например). При этом в Переменную ОбъектКопирования будет передан объект, с которого скопировали. Копирование не следует путать с вводом на основании.
    Процедура ВводНового(Копирование)
    Если ИмяПользователя() <> "Бухгалтер" Тогда
    Предупреждение("Вам не позволено создавать этот документ!");
    СтатусВозврата(0); Возврат; //Новый документ не будет создан
    КонецЕсли;
    Если Копирование = 1 Тогда
    Возврат;
    КонецЕсли;
    КонецПроцедуры
    ВводНаОсновании(Основание)
    Выполняется при вводе нового документа на основании другого. В переменную Основание передается контекст документа-основания, т.е. теперь вы можете обратиться к его реквизитам через эту переменную:
    СуммаДоплаты=Основание.СуммаСверху; //Свой реквизит принимает значение реквизита документа-основания.
    Помните, что после обработки этой процедуры система не сохранит информацию о том, что новый документ введен на основании другого. Для реализации такой возможности вы должны иметь во вновь создаваемом документе реквизит типа "Документ", куда можно записать ссылку на документ-основание. Лучше сделать её доступной пользователю, чтобы он потом имел возможность выбрать другой документ-основание.
    ПриЗаписи()
    Выполняется при записи (перезаписи) документа. Имейте ввиду, что операторы этой процедуры выполняются ДО фактической записи документа в базу. Это, так сказать, подготовительная работа.
    ПриВводеСтроки()
    Вызывается при вводе пользователем новой стоки многострочной части документа. Такой операцией, например, можно отменить ввод новых строк, если в документе нельзя вводить строки вручную (можно добавить какое-либо условие):


    Процедура ПриВводеСтроки()

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

    КонецПроцедуры
    ПриНачалеРедактированияСтроки()
    Обрабатывает начало изменения существующей (!) строки ( когда пользователь ручками вводит или изменяет значения реквизитов табличной части). Исходя из примера, описанного выше для процедуры ПриВводеСтроки(), догадайтесь, как можно запретить редактирование стоки?
    ПриРедактированииНовойСтроки()
    Похожая на предыдущую, но с тем отличием, что вызывается только при редактировании ВНОВЬ созданной строки.
    ПриОкончанииРедактированияСтроки (ФлагНовойСтроки)
    ФлагНовойСтроки - имя переменной, в которую будет записана 1, если окончен ввод НОВОЙ строки, соответственно - 0, если закончено редактирование ИМЕВШЕЙСЯ. Процедура вызывается, когда пользователь "дезактивирует" строку мышкой, нажатием Enter, или Esc (кроме случая, когда отказываются от редактирования новой строки).
    ПриУдаленииСтроки()
    Действие, которое будет обработано данной процедурой, очевидно исходя из имени процедуры. Что еще добавить?
    ПриИзмененииПорядкаСтрок (ФлагДействия)
    ФлагДействия - имя переменной, которая станет "-1", если строка поднимается вверх, станет "1" при перемещении строки вниз, и станет "0", если изменяются номера строк, например, при сортировке. А что при этом сделать - это уже ваша фантазия (моей не хватает :).
    Не забывайте о том, что имеются предопределенные процедуры, общие для любых форм системы 1С, такие как ПриОткрытии(), ПриЗакрытии() и т.д. Их подробное описание здесь не приводится, дабы не перегружать главу о документах.



    Описание конфигурации


    Быстрая и простая конфигурация для сети магазинов.

    Идеальна для модели "Склад - сеть магазинов".

    Мощные аналитические отчеты.

    Анализ расхода товара по складу, реализатору (по прибыли, по количеству)

    Анализ поступления выручки торговых точек

    Анализ остатков по складу и реализаторам

    Анализ розничных цен

    Импорт-экспорт единичных документов. Удобно перебрасывать документы из

    одной программы в другую, если учет ведется в разных программах.

    Учет товара по торговым точкам идет в розничных ценах.

    Весь товарооборот идет через склад. Например переброс товара из

    одной торговой точки в другую проходить в два этапа.

    1 Возврат товара на склад (ДокументРеализатора-Возврат)

    2 Отпуск товара реализатору (ДокументРеализатора-Расход)

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

    1. Списание суммой (СписаниеРеализатора)

    2. Списание товаром (ДокументРеализатора-Списание)

    3. Возврат на склад, потом списать со склада (ДокументРеализатора-Возврат)

    Большинство отчетов вынесено во внешние отчеты. Исправлять и дорабатывать

    отчеты можно без выбрасывания пользователей из программы 1с-Торговля.

    В прайс-листе видны две колонки: остатки на складе и остатки реализатора.

    При обновлении прайса в него заносится товар с не нулевыми остатками на складе.




    Вызывается при открытии формы списка


    ПриОткрытии
    Вызывается при открытии формы списка справочника. Можно задать начальные значения для переменных, проверить права пользователя на открытие данного справочника и т.д.
    ПриЗакрытии
    Вызывается при закрытии формы списка справочника.
    ПриЗаписи
    Вызывается при записи элемента справочника, если элементы вводятся прямо в форме списка, а не в форме элемента. Это используется для справочников с простой структурой, например справочник Должности. В этой процедуре можно проверить вводимые данные на наличие ошибок.
    Пример, справочник Должности


    Организация подбора


    Синтаксик: ОткрытьПодбор(<Объект>,<ИмяФормы>,<КонтекстФормы>,<ФлагМножВыбора>,<ТекЗнач>)
    ОткрытьПодбор("Справочник.Номенклатура","ФормаДляПодбора",Конт,1);
    Процедура ОбработкаПодбора(Элемент,КонтФормы)

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

    ...Товар = Элемент;

    КонецПроцедуры
    Можно воспользоваться контекстом формы и сразу перейти в нужную группу, например:
    ОткрытьПодбор("Справочник.Номенклатура","ФормаДляПодбора",Конт,1);

    Конт.ИспользоватьРодителя(грпСпиртное);
    Процедура ОбработкаПодбора(Элемент,КонтФормы)

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

    ...Товар = Элемент;

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




    Осн ставка




    2


    М16




    ГДЕ-221


    Изделие №2


    8.00


    80.00








    ПРС-555


    Изделие №1


    12.50


    120.00







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


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

    Слева вы видите дерево конфигурации, в котором редактируется структура базы данных.
    Справа окно Синтакс-помощника, которое часто используется при написании программных модулей для того, чтобы вспомнить синтаксис или параметры конкретной процедуры/функции.




    Отбор


    В форме списка справочника элементы могут быть отфильтрованы, т.е. пользователю будут показаны только нужные элементы. Программно установить отбор можно методом УстановитьОтбор (Реквизит, Значение). Для этого у реквизита должен быть установлен флажок "Отбор по реквизиту" в Конфигураторе .








    Отчет "Библиотечная выписка"


    Экранная форма диалога отчета выглядит следующим образом:
    Отчет

    Пример работы отчета:
    Отчет

    Модуль отчета см. в конфигурации "Мини-библиотека".




    Отчет "Доходы и расходы"


    Экранная форма диалога отчета выглядит следующим образом:
    Отчет

    Сначала указывается тип отчета: доходы или расходы. Затем выбирается период, за которые формируется отчет. В отчете можно указать 1 или 2 группировки Участник и Статья в произвольном порядке. Также можно указать отбор по одному участнику или статье.
    Модуль отчета см. в конфигурации "Денежки".
    Пример работы отчета (отчет о доходах, включены две группировки):
    Отчет

    Пример работы отчета (отчет о расходах, включена только одна группировка Статьи):
    Отчет

    Мини-библиотека




    Отчет "Долги читателя"


    Экранная форма диалога отчета выглядит следующим образом:
    Отчет

    Пример работы отчета:
    Отчет

    Модуль отчета см. в конфигурации "Мини-библиотека".




    Отчет курьера


    Данный документ оформляет результат поездки курьера по путевому листу. Отмечается количество фактически доставленных товаров. Экранная форма документа выглядит следующим образом:
    Отчет курьера

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

    Пока ПолучитьСтроку()=1 Цикл
    Если Доставлено > 0 Тогда
    Регистр.Доставка.Товар = Товар;

    Регистр.Доставка.Клиент = Клиент;

    Регистр.Доставка.Цена = Цена;

    Регистр.Доставка.Заказ = Заказ;

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

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

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

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

    Регистр.Заказы.Клиент = Клиент;

    Регистр.Заказы.ДатаДоставки = ДатаДоставки;

    Регистр.Заказы.Цена = Цена;

    Регистр.Заказы.Заказ = Заказ;

    Регистр.Заказы.Количество = Доставлено;

    Регистр.Заказы.Сумма = Сумма;

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

    Регистр.Доходы.Товар = Товар;

    Регистр.Доходы.Клиент = Клиент;

    Регистр.Доходы.Доход = Сумма;

    Регистр.Доходы.ДвижениеВыполнить();
    КонецЕсли;

    Если Фл_ВозвратОстатков=1 Тогда
    Если Доставлено < Заказано Тогда
    Регистр.Доставка.Товар = Товар;

    Регистр.Доставка.Клиент = Клиент;

    Регистр.Доставка.Цена = Цена;

    Регистр.Доставка.Заказ = Заказ;

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

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

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

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

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

    Регистр.Остатки.Количество = Заказано - Доставлено;

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




    Отчет "Остатки материалов"


    Экранная форма диалога отчета выглядит следующим образом:
    Отчет

    Шаблон печатной формы (в Конфигураторе):
    Отчет

    Модуль отчета:
    Процедура Сформировать()
    Запрос = СоздатьОбъект("Запрос");

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

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

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

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

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

    |Группировка Материал;

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

    |Условие (Материал в ВыбрМатериалГруппа);

    |Условие (Склад в ВыбрСклад);

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

    ...Возврат;

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

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

    Пока Запрос.Группировка(1) = 1 Цикл
    Если Запрос.Материал.ЭтоГруппа()=1 Тогда

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

    Иначе
    Таб.ВывестиСекцию("Материал");

    Если Фл_НеВыводитьСклады = 0 Тогда

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

    ......Таб.ВывестиСекцию("Склад");

    ...КонецЦикла;

    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    Таб.Опции(0);

    Таб.Показать("ОстаткиМатериалов", "");
    КонецПроцедуры
    Примеры работы отчета:
    Отчет

    В следующем примере отключена детализация по складам:
    Отчет





    Отчет "Остатки"


    Экранная форма диалога отчета выглядит следующим образом:
    Отчет

    Модуль отчета:
    Процедура Сформировать()
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "

    |Кошелек = Регистр.Кошельки.Кошелек;

    |Участник = Регистр.Кошельки.Кошелек.Участник;

    |Сумма = Регистр.Кошельки.Сумма;

    |Группировка Кошелек;

    |Функция СуммаВКошельке = КонОст(Сумма);

    |Условие(Кошелек в ВыбрКошелек);

    |Условие(Участник в ВыбрУчастник);

    |";

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

    .......Возврат;

    КонецЕсли;
    Таб = СоздатьОбъект("Таблица");

    Таб.ВывестиСекцию("Все<");

    Пока Запрос.Группировка(1) = 1 Цикл

    ....... Таб.ВывестиСекцию("Кошелек");

    КонецЦикла;

    Таб.ВывестиСекцию("Все>");

    Таб.Показать();
    КонецПроцедуры
    Пример работы отчета:
    Отчет





    Отчет "Товары"


    Данный отчет показывает текущую картину по товарам и оценивает дефицит товаров на указанный будущий период. Экранная форма диалога отчета выглядит следующим образом:
    Отчет

    Пользователь может ограничить выборку конкретной группой товаров. Кроме того, пользователь указывает период времени в днях, за который учитываются заказы. Это позволяет заранее определить дефицитные товары и не допустить срыва поставок.
    Пример работы отчета представлен ниже:
    Отчет

    Дефицит определяется по формуле:
    Дефицит = (Заказано - Доставляется) - Остаток;




    Открытие формы


    Формы - это основной вид диалога с пользователем. Все справочники, документы, журналы, отчеты и обработки имеют экранные формы. Обычно форма открывается пользователем интерактивно (мышкой), но форму можно открыть и программно.
    Конт = 0; //контекст формы (ссылка на форму)

    ОткрытьФорму("Справочник.Сотрудники.Основная",Конт); //открыть форму списка справочника

    ОткрытьФорму(ВыбрСотрудник); //открыть форму элемента справочника

    ОткрытьФорму("Отчет.ГлавнаяКнига");

    ОткрытьФорму("Документ.ПриемНаРаботу",Конт); //новый документ

    //можно открыть форму модально и еще можно передать в форму параметр

    //в модуле формы переданный параметр доступен через конструкцию Форма.Параметр

    ОткрытьФормуМодально("Обработка.УсловияПоиска",10);




    Отсчет даты


    Получим дату, отстоящую по календарю от указанной даты на заданное количество дней. Календарь пропускает дни с нулевыми значениями (выходные и праздники).
    КонецОтпуска = Календари.Служащие.ПолучитьДату (НачалоОтпуска, 28);
    Мини-зарплата




    Параметры предопределенных процедур


    Некоторые предопределенные процедуры имеют параметры, в которые передается информация о произошедшем событии. Например, для процедуры ПриВыбореВладельца(Элемент) в параметр Элемент передается значение нового владельца.




    Печатные формы документа


    Документ обычно имеет печатную форму. Печатная форма полностью формируется средствами встроенного языка 1С, что придает большую гибкость программе. Это одна из причин ошеломляющего успеха системы 1С:Предприятие. Печатная форма документа - это фактически отчет, формируемый обычно из формы открытого документа и содержащий сведения из этого документа. Чтобы научиться формировать печатные формы, вам нужно изучить главу Отчеты (объект "Таблица"). Все операторы, которые выполняют вывод на печать данных отчетов, точно так же позволяют печатать данные из документов.
    У документа может быть несколько шаблонов печатных форм. Средствами встроенного языка (метод ИсходнаяТаблица) задается тот шаблон печатной формы, который будет использоваться.
    Шаблоны печатных форм (таблицы) могут быть общие. Это дает возможность использовать один шаблон для печати нескольких видов документов. Т.е. общая таблица является глобальной для конфигурации и может быть использована в любом модуле. Примером из типовой конфигурации может являться шаблон печатной формы "Отчет о движении документа", который используется разными модулями конфигурации.
    Маленькая хитрость: если вы создали свою печатную форму для какого-либо документа, или "заточили" типовую, рекомендую сохранить её в отдельном файле печатной формы (*.mxl) тогда при переходе с релиза на релиз вам не будет нужды переделывать таблицы документа, достаточно будет в операторе ИсходнаяТаблица() процедуры печати вставить ссылку на внешний файл.




    Перебор документов


    ДокПрием.ВыбратьДокументы(дата1, дата2); //можно задать период выборки

    Пока ДокПрием.ПолучитьДокумент()=1 Цикл

    ......<действия с текущим документом>

    КонецЦикла;




    Перебор групп расчета


    Для Ном=1 По Метаданные.ГруппаРасчета() Цикл

    ....кфгГруппаРасч = Метаданные.ГруппаРасчета(Ном);

    ....//недоработка фирмы 1С. По имени группы расчета нельзя получить саму группу расчета как объект.

    ....//если помечтать, то можно было бы сделать вот так:

    ....// ГруппаРасч = ГруппаРасчета.ПолучитьАтрибут(кфгГруппаРасч.Идентификатор);

    КонецЦикла;
    Еще я совсем не понимаю, почему группа расчетов не является типообразующим
    объектом в 1С. Т.е. нельзя, например, завести реквизит справочника и указать его тип "ГруппаРасчетов.ВсеНачисления". Нельзя в диалоге поместить поле типа "ГруппаРасчета", чтобы пользователь мог самостоятельно выбрать группу расчетов так же, как он выбирает вид расчета. Будем надеяться, что в версии 8.0 фирма 1С исправит эти упущения.
    Календари





    Перебор групп расчета
    Ссылка на календарь

    Перебор групп расчета
    Подсчет дней и часов

    Перебор групп расчета
    Отсчет даты





    Перебор операций и проводок с фильтром


    Синтаксис: ВыбратьОперацииСПроводками (<НачалоПериода>, <КонецПериода>, <Фильтр>, <Валюта>, <ПланСчетов>, <РазделительУчета>)
    Пример, выбрать проводки по счету "10.1" по филиалу "Северный".
    Опер = СоздатьОбъект("Операция");

    Опер.ВыбратьОперацииСПроводками(НачДата, КонДата,"10.1",,ПланыСчетов.Основной,филСеверный);

    Пока Опер.ПолучитьПроводку()=1 Цикл

    ....<действия с текущей проводкой>

    КонецЦикла;
    Примеры фильтра:








    Перебор операций и проводок с указанием счета и корр. счета


    Синтаксис: ВыбратьОперацииСПроводками (<НачалоПериода>, <КонецПериода>, <Счет>, <КорСчет>, <Флаг>, <Валюта>, <ПланСчетов>, <РазделительУчета>)
    <Счет>. Необязательный параметр. Счет — счет, по которому будут отбираться проводки.

    <КорСчет>. Необязательный параметр. Счет — корреспондирующий счет, по которому будут отбираться проводки. Параметр имеет смысл, если указан параметр <Счет>.

    <Флаг>. Необязательный параметр. Число — признак вида оборота. Параметр может принимать значения: 1 — отбирать проводки только по дебету счета; 2 — отбирать проводки только по кредиту счета; 3 — отбирать проводки и по дебету, и по кредиту. По умолчанию 3.
    Пример, выбрать проводки Д10.1 К51 или Д51 К10.1
    Сч10_1 = СчетПоКоду("10.1");

    Сч51 = СчетПоКоду("51");

    Опер = СоздатьОбъект("Операция");

    Опер.ВыбратьОперацииСПроводками (НачДата, КонДата, Сч10_1, Сч51,,,ПланыСчетов.Основной);

    Пока Опер.ПолучитьПроводку()=1 Цикл

    ....<действия с текущей проводкой>

    КонецЦикла;




    Перебор счетов


    1-й вариант:

    Счета = СоздатьОбъект("Счет.ОснПлан");

    Счета.ВыбратьСчета();

    Пока Счета.ПолучитьСчет()=1 Цикл

    ....ТекСчет = Счета.ТекущийСчет();

    ....<действия с тек. счетом>

    КонецЦикла;

    2-й вариант:

    Счета = СоздатьОбъект("Счет"); //не указан план счетов

    Счета.ИспользоватьПланСчетов(ПланыСчетов.ОснПлан); //а вот теперь указан

    Счета.ВыбратьСчета();

    Пока Счета.ПолучитьСчет()=1 Цикл

    ....ТекСчет = Счета.ТекущийСчет();

    ....<действия с тек. счетом>

    КонецЦикла;




    Перебор списка значений


    стр = "";

    Для Номер = 1 По СписокЗнач.РазмерСписка() Цикл

    ...значение = СписокЗнач.ПолучитьЗначение(Номер, стр); //получить значение и представление

    ...Сообщить(значение + ", " + стр);

    КонецЦикла;




    Перебор строк таблицы значений


    1-й способ.
    ТабЗнач.ВыбратьСтроки();

    Пока ТабЗнач.ПолучитьСтроку()=1 Цикл

    ...Сообщить(ТабЗнач.Сотрудник);

    КонецЦикла;



    2-й способ.

    Для НомерСтроки = 1 По ТабЗнач.КоличествоСтрок() Цикл

    ...ТабЗнач.ПолучитьСтрокуПоНомеру(НомерСтроки);

    ...Сообщить(ТабЗнач.Сотрудник);

    КонецЦикла;




    Перебор видов расчета, входящих в группу


    Для Ном=1 По ГруппаРасчетов.ВсеНачисления.Количество() Цикл

    ....ВР = ГруппаРасчетов.ВсеНачисления.ПолучитьРасчет(Ном);

    ....Сообщить(ВР.Код);

    КонецЦикла;




    Перебор всех видов расчета


    Для Ном=1 По Метаданные.ВидРасчета() Цикл

    ....кфгВР = Метаданные.ВидРасчета(Ном);

    ....ВР = ВидРасчета.ПолучитьАтрибут(кфгВР.Идентификатор);

    КонецЦикла;




    Перебор записей журнала расчетов


    Например, организуем перебор записей с периодом действия в январе.
    ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");

    ДатаНач = '01.01.2002';

    ДатаКон = '31.01.2002';

    ЖЗ.ВыбратьЗаписи(ДатаНач, ДатаКон);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    ......<действия с тек. записью>

    КонецЦикла;
    А теперь организуем перебор записей, введенных в январе.
    ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");

    ДатаНач = '01.01.2002';

    ЖЗ. ВыбратьПериод(ДатаНач);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    .......<действия с тек. записью>

    КонецЦикла;
    Отличие методов ВыбратьЗаписи и ВыбратьПериод проявляется, если запись введена в другом месяце, но период ее действия лежит в январе. Например, в феврале сотруднику выдают премию за январь. Тогда запись будет введена в феврале (период регистрации), но период ее действия - январь. В первый цикл она попадет, а во второй нет.
    Посчитаем все начисления текущего сотрудника за январь:

    ВсегоНачислено = 0;

    ЖЗ.ВыбратьЗаписиПоОбъекту (ТекСотр, ДатаНач, ДатаКон);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    ....Если ЖЗ.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления)=1 Тогда

    ..........ВсегоНачислено = ВсегоНачислено + ЖЗ.Результат;

    ....КонецЕсли;

    КонецЦикла;
    Теперь рассчитаем все записи текущего сотрудника, введеные в текущем месяце:

    ЖЗ.ВыбратьПериодПоОбъекту (ТекСотр, ДатаНач);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    ........ЖЗ.Рассчитать();

    КонецЦикла;
    Рассчитаем все записи по документу, независимо от того, в каком расчетном периоде записи порождались:
    ЖЗ.ВыбратьЗаписиПоДокументу
    (ВыбрДокумент);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    ......ЖЗ.Рассчитать();

    КонецЦикла;
    Рассчитаем все записи по указанному подразделению. В журнале расчетов указана графа отбора "Подразделение".
    ТекПер = ЖЗ.ТекущийПериод();

    ЖЗ.ВыбратьПоЗначению ("Подразделение",ВыбрПодразделение, ТекПер, ТекПер);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    ......ЖЗ.Рассчитать();

    КонецЦикла;




    Передача значений точкам серий


    Это самый важный метод диаграммы. Он устанавливает значение серии <НомерСерии> в точке <НомерТочки> равным <Значение> с возможностью последующей расшифровки. Все параметры, кроме параметра <Расшифровка> должны быть числовыми выражениями.

    Синтаксис:
    УстановитьЗначение(<НомерТочки>,<НомерСерии>,<Значение>,<Расшифровка>)
    <Расшифровка> - параметр не обязательный, может иметь любой тип. Это значение, которое будет передано предопределенной процедуре ОбработкаЯчейкиТаблицы при двойном щелчке мышью на точке диаграммы. Так можно получать расшифровки точек диаграммы. Удобная штука!




    Переменные в запросе


    С помощью переменных запроса происходит обращение к требуемым данным. Переменные запроса чаще всего ссылаются на справочники и документы. Кроме того можно ссылаться на журналы расчетов, регистры, бухгалтерские счета.
    |ФИО = Справочник.Сотрудники.Наименование;

    |Долж = Справочник.Сотрудники.Должность;

    |ДатаПриема = Справочник.Сотрудники.ДатаПриема;

    |ДатаУвольнения = Справочник.Сотрудники.ДатаУвольнения;

    |";




    Пересечение секций


    Можно выводить область пересечения горизонтальной и вертикальной секций.
    Пока СпрСотр.ПолучитьЭлемент()=1 Цикл

    .......Таб.ВывестиСекцию("Сотр|ФИО");

    .......Для Месяц = 1 По 12 Цикл

    ..............Таб.ПрисоединитьСекцию("Сотр|Месяц");

    .......КонецЦикла;

    КонецЦикла;

    Таб.Показать();




    Периодические реквизиты


    Включение опции «Периодический» позволяет указать для реквизита справочника хранение истории изменений его значения. Такой реквизит в системе 1С:Предприятие называется периодическим и обладает следующим свойством: в отличие от «обычных» (не периодических) реквизитов, система 1С:Предприятие хранит значения такого реквизита по датам их изменения. При обращении к значению такого реквизита на некоторую дату выдается его значение на эту дату, либо, если таковое отсутствует, — на ближайшую предыдущую дату, на которую устанавливалось значение реквизита.
    Подобное свойство реквизита справочника позволяет, например, легко организовать хранение истории изменения курсов в справочнике валют.
    К периодическому реквизиту можно обращаться при помощи встроенного языка системы 1С:Предприятие — получать и записывать значение реквизита на указываемую дату. Однако, следует иметь в виду, что при получении значения реквизита на какую-то дату извлекается его значение на указанную или (если значение на указанную дату отсутствует) на ближайшую предыдущую дату, а запись значения периодического реквизита выполняется всегда на указанную дату.
    В режиме использования конфигурации для периодического реквизита можно вызвать окно «История». Это окно представляет собой таблицу, состоящую из двух граф: дата изменения значения реквизита справочника и значение на эту дату. Окно «История» позволяет редактировать историю изменений значения реквизита напрямую: вводить новые строки, редактировать или удалять существующие.




    Периодические реквизиты


    Чтение и запись периодических реквизитов.

    Установка даты выборки периодических реквизитов для всего справочника.








    Подбор из справочника


    Функция подбора позволяет выбирать несколько значений из справочника или другого объекта, не закрывая его. Например, есть документ РасходнаяНакладная, в котором пользователь может указать несколько товаров.




    Подбор


    Функция подбора позволяет выбирать несколько значений из справочника или другого объекта, не закрывая его. Например, есть документ РасходнаяНакладная, в котором пользователь может указать несколько товаров.
    Синтаксик: ОткрытьПодбор(<Объект>,<ИмяФормы>,<КонтекстФормы>,<ФлагМножВыбора>,<ТекЗнач>)
    ОткрытьПодбор("Справочник.Номенклатура","ФормаДляПодбора",Конт,1);
    Процедура ОбработкаПодбора(Элемент,КонтФормы)

    ...НоваяСтрока();

    ...Товар = Элемент;

    КонецПроцедуры
    Эти процедуры и функции часто применяются при программировании на 1С, поэтому знать их обязательно!








    Подчиненные справочники


    Справочник-владелец, это также справочник-хозяин.

    Справочник-владелец и подчиненный справочник также называются связанными
    справочниками.

    В терминах реляционных баз данных справочник-владелец - это родительская таблица, подчиненный справочник - это дочерняя таблица.




    Подчиненные справочники


    Между справочниками может быть установлено отношение подчиненности. В терминах реляционных баз данных, между таблицами устанавливается связь "один-ко-многим". В этом случае каждый элемент подчиненного справочника будет связан с одним из элементов справочника-владельца.Иногда можно сказать, что элементы одного справочника принадлежат элементам другого. Например, в системе может быть справочник НалоговыеЛьготы. Тогда его можно сделать подчиненным справочнику Сотрудники. Это означает, что "Сотрудник владеет налоговыми льготами".








    Справочник Сотрудники

    Справочник НалоговыеЛьготы

  • Иванов Иванов Иванов

  • Петров Петр Петрович

  • Светлов Михаил Петрович

  • Цветков Антон Васильевич







  • Подсчет дней и часов по календарю


    Подсчитаем количество рабочих дней для служащих за заданный период с учетом выходных и праздников:

    Дни = Календари.Служащие.Дней (НачДата, КонДата);
    Подсчитаем количество часов для рабочих за заданный период с учетом выходных, праздников и укороченных предпраздничных дней:

    Часы = Календари.Рабочие.Часов (НачДата, КонДата);

    Календари, казалось бы простой объект, но без них отсчитывать дни было бы неимоверно тяжело. Наверное, программисты в других программах мучаются без календарей. Пожелаем им приятных кошмаров. ;-)




    Поиск документа


    ДокПрием.НайтиДокумент(Док);

    ДокПрием.НайтиПоНомеру(123)




    Поиск элемента


    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    Если СпрСотр.НайтиЭлемент(ВыбрСотр)=1 Тогда

    ....//элемент становится текущим

    ....СпрСотр.Родитель = грпРаботающие;

    ....СпрСотр.Записать();

    КонецЕсли;




    Поиск элемента в цикле


    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    СпрСотр.ИспользоватьРодителя(грпРаботающие);

    СпрСотр.ИспользоватьДату(РабочаяДата());

    СпрСотр.ВыбратьЭлементы();

    Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
    Если СпрСотр.Должность = длжПлотник Тогда

    ....Прервать; //нашли работающего плотника! выйти из цикла

    КонецЕсли;
    КонецЦикла;

    <действия с найденным элементом>




    Поиск операции


    Синтаксис: НайтиОперацию([<Документ>])
    В системе 1С:Предприятие каждая операция принадлежит документу. Причем операция принадлежит только одному документу, а у документа может существовать только одна операция. Операции введенные вручную принадлежат документам специального вида «Операция». Поэтому не существует возможности передачи такого значения как «Операция». Для «идентификации» операции фактически используется значение документа, которому она принадлежит. Поэтому для позиционировании объекта «Операция» непосредственно на конкретную операцию используется значение типа «Документ».
    Пример,

    Опер = СоздатьОбъект("Операция");

    Если Опер.НайтиОперацию(ВыбрДокумент)=1 Тогда

    ...<операция стала текущей>

    КонецЕсли;




    Поиск по коду


    Если СпрСотр.НайтиПоКоду(1) = 1 Тогда

    ....ЭлементИлиГруппа = СпрСотр.ТекущийЭлемент();

    КонецЕсли;




    Поиск по наименованию


    Если СпрСотр.НайтиПоНаименованию("Работающие")=1 Тогда

    ....грпРаботающие = СпрСотр.ТекущийЭлемент();

    КонецЕсли;
    Режим = 1; // 1 - поиск внутри установленного подчинения (родителя) (по умолч.); 0 - поиск во всем справочнике

    ФлагПоиска = 0; //1 - найти точное соответствие; 0 - найти наименование по первым символам (по умолч)

    СпрСотр.ИспользоватьРодителя(грпРаботающие);

    Если СпрСотр.НайтиПоНаименованию("Ив",Режим,ФлагПоиска)=1 Тогда

    ....ПервыйРаботающийИв = СпрСотр.ТекущийЭлемент();

    КонецЕсли;




    Поиск по реквизиту


    ИмяРекв = "Год"; //у реквизита должен быть установлен флажок Сортировка в Конфигураторе

    ФлагГлобПоиска = 1; // 1- искать во всем справочнике, 0 - искать в пределах подчинения

    Если СпрСотр.НайтиПоРеквизиту(ИмяРекв,1980,ФлагГлобПоиска)=1 Тогда

    .....НайденныйЭлемент = СпрСотр.ТекущийЭлемент();

    КонецЕсли;




    Поиск в таблице значений


    Синтаксис: НайтиЗначение(<Знач>,<Строка>,<Колонка>)

    Возвращает число: 0 - значение не найдено; 1 - значение найдено

    Если указан параметр <Строка>, то поиск производится только по заданной строке

    Если указан параметр <Колонка>, то поиск производится только по заданной колонке
    номстр = 0;

    Если ТабЗнач.НайтиЗначение (10000, номстр, "Оклад") = 1 Тогда

    ...ТабЗнач.ПолучитьСтрокуПоНомеру(номстр);

    ...Сообщить(ТабЗнач.Сотрудник);

    КонецЕсли;




    Поиск значения в списке


    //поиск по значению

    Синтаксис: НайтиЗначение(<Знач>)

    Возвращает номер позиции списка, в которой найдено значение или 0, если не найдено
    номстр = СписокЗнач.НайтиЗначение (Сотрудник);
    //проверка вхождения значения в список

    //работает очень быстро, если между проверками список не изменяется.

    //если передается элемент справочника, а в списке хранятся группы справочника

    //тогда проверяется вхождение элемента справочника в группу

    Если СписокЗнач.Принадлежит(Сотрудник)=1 Тогда

    ....<действия>

    КонецЕсли;




    Пометка на удаление


    Для контроля ссылочной целостности базы данных удаляемые элементы всего лишь помечаются на удаление. Затем специальной командой меню Операции => "Удаление помеченных объектов" в монопольном режиме система 1С проконтролирует ссылочную целостность и физически удалит элементы из базы данных, если на них нет ссылок в других объектах.
    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    СпрСотр.НайтиЭлемент(ВыбрСотрудник);

    СпрСотр.Удалить(0); //пометка на удаление
    //можно проверить, помечен ли элемент на удаление

    //функция возвращает 1 - если помечен, 0 - если нет

    Пометка = СпрСотр.ПометкаУдаления();
    //можно снять пометку на удаление

    СпрСотр.НайтиЭлемент(ВыбрСотрудник);

    СпрСотр.СнятьПометкуУдаления();




    Порядок сортировки


    Перед выборкой можно задать порядок сортировки следующими методами:
    ПорядокКодов()

    ПорядокНаименований()

    ПорядокРеквизита(ИмяРекв) //у реквизита должен быть установлен флажок Сортировка в Конфигураторе

    ОбратныйПорядок()
    Например, ниже открывается выборка сотрудников, отсортированных по номерам по убыванию:
    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    СпрСотр.ПорядокКодов();

    СпрСотр.ОбратныйПорядок();

    СпрСотр.ВыбратьЭлементы();




    Последовательности


    Последовательности документов - специальный механизм системы 1С, который позволяет поддерживать правильность итогов и данных проводок документов. Если документы при проведении использует данные бухгалтерских итогов или итогов регистров, то в случае, если задним числом каким-то образом меняются итоги, необходимо автоматически перепроводить все документы, которые использовали измененные итоги. Вот надзором за этим делом и занимаются Последовательности. При описании последовательности в конфигураторе, описывается, какие изменения регистров или бухгалтерских итогов по счетам будут влиять на последовательность, и какие документы входят в эту последовательность (это могут быть документы разного вида). Граница последовательности (ГП) - позиция последнего проведенного с "правильными" итогами документа. Если какие-то итоги изменяются задним числом, граница последовательности отодвигается назад на последний документ, при проведении которого использовались последние "нетронутые" итоги, а все документы, проведенные на основе изменившихся данных итогов, окажутся после границы последовательности. Восстановление последовательности - значит перепроведение всех документов, начиная от границы последовательности, заканчивая точкой актуальности или рабочей датой. Для восстановления последовательности в пользовательском режиме необходимо вызвать пункт Проведение документов… меню Операции.
    Методы последовательностей записываются через точку после полного имени последовательности:
    Последовательность.УчетТоваров.ПринадлежитПоследовательности(ТекДокумент);

    Здесь "УчетТоваров" - имя последовательности, заданной в конфигурации.




    Постановка задачи


    Требуется создать простейшую систему расчета зарплаты, удовлетворяющую следующим минимальным требованиям:
  • Минимальный кадровый учет (справочник Сотрудники, документы Прием, Перемещение, Увольнение, журнал Кадровые документы)

  • Две категории сотрудников: "Руководители и специалисты" (сидят на окладе), "Рабочие" (работают по тарифу)

  • Возможность учета невыходов сотрудника на работу (например, прогулы).

  • Ввод премий сотрудникам.

  • Расчет подоходного налога с учетом налоговых льгот (стандартных вычетов).

  • Отчетность по зарплате (ведомость на выплату зарплаты, свод, расчетные листочки, лицевые счета)





  • Постановка задачи


    Требуется создать простейшую информационно-справочную систему для трудоустройства. Система должна хранить список работодателей и соискателей. У каждого работодателя может быть несколько вакансий. У каждого соискателя может быть несколько резюме. Система должна позволять работодателям подбирать сотрудников, а соискателям помогать находить место работы.




    Постановка задачи


    Требуется создать простейшую почтовую систему для локальной сети предприятия. Система должна позволять отправлять письма и должен быть общий чат. У каждого пользователя может быть черный список его недругов, от которых он не желает получать письма. Нужно иметь возможность прицеплять к письму различные объекты базы 1С:Предприятие, например, товары, накладные и пр.




    Постановка задачи


    Требуется создать простейшую систему учета семейных доходов и расходов. Система должна показывать текущий остаток в кошельке у каждого члена семьи и общие семейные накопления. Система должна давать возможность узнать доходы и расходы семьи за заданный период с группировкой по участникам или по статьям доходов и расходов.




    Постановка задачи


    Требуется создать простейшую систему учета для библиотеки, которая позволит выдавать книги читателям, отслеживать задолженности читателя и формировать отчеты по совершенным операциям за заданный период.
    Конфигурация, по-видимому, должна содержать справочник Книги. У каждой книги есть уникальный библиотечный номер (код). Необходимо отметить, что может быть несколько экземпляров одного и того же произведения.
    Очевидно, в конфигурации должен быть справочник Читатели. Каждому читателю выдается читательский билет с уникальным номером.
    В программе должны фиксироваться следующие события:
  • Выдача книг читателю из библиотеки на определенный срок

  • Продление книги

  • Возврат книги читателем в библиотеку

  • Потеря книги читателем

  • Для каждого события в конфигурации необходимо предусмотреть соответствующий документ.
    Правила работы библиотеки следующие:
  • Читатель может взять в библиотеке только определенное количество книг (задается директором библиотеки).

  • Читатель берет книги обычно на месяц, но может сразу взять книгу на больший срок, если явно скажет об этом.

  • Читатель может продлевать книгу, т.е. сообщать о том, что он вернет ее позже указанного ранее срока.

  • При просрочке возврата книги, читатель получает предупреждение.

  • Когда предупреждений у читателя накапливается больше определенного предела, он лишается правом пользования библиотекой на 1 месяц.

  • При потере книги читатель лишается правом пользования библиотекой на 1 месяц, независимо от количества предупреждений.

  • В программе должна быть возможность сформировать библиотечную выписку, которая показывает все совершенные операции за заданный период. Необходимо иметь возможность выбрать операции только по указанному читателю и/или по указанной книге.
    В программе должна быть возможность узнать долги конкретного читателя на данный момент, т.е. какие книги у него сейчас на руках и когда он должен их вернуть.




    Постановка задачи


    Требуется создать простую учетную систему для магазина с доставкой на дом. Система должна учитывать остатки товаров, оформлять заказы от клиентов и формировать путевые листы для курьеров.




    Постановка задачи


    Требуется создать средствами 1С игру "Реверси". Правила игры следующие.
    Игра ведется на поле 8х8. Противники ходят по очереди. На каждом ходе игрок может поставить на поле одну фишку своего цвета. Фишки можно ставить только в том случае если одна или несколько фишек противника попадают в окружение. Окруженной считается фишка или ряд фишек если они ограничены с двух противоположных сторон по вертикали, горизонтали или диагонали фишками противника. Окруженные фишки меняют свой цвет. Если игрок не может выполнить ход, то право хода передается противнику. Игра продолжается до тех пор, пока хотя бы один из игроков может ходить. Побеждает тот, чьих фишек в конце игры оказывается больше.




    Постановка задачи


    Требуется создать средствами 1С игру "Охота на лис". Правила игры следующие.
    Цель игры состоит в том, чтобы как можно быстрее найти всех лис на игровом поле.

    Игровое поле состоит из информационого и игрового полей.

    Игрок имеет возможность открыть любую клетку, щелкнув ее левой кнопкой мыши. Если в клетке находится лиса, то она показывается.

    Если лисы нет, в клетке появится цифра, которая указывает, сколько лис находится на горизонтали, вертикали и диагоналях клетки. Игра заканчивается после поимки всех лис.




    Постановка задачи


    Требуется разработать автоматизированную систему, с помощью которой можно будет производить основную работу по кадровому учету в строительной организации.
    Функции отдела кадров:
  • Прием на работу новых сотрудников

  • Увольнение сотрудников

  • Кадровое перемещение

  • Воинский учет

  • Оформление отпусков

  • Оформление больничных листов

  • Ведение штатного расписания

  • Отчетность

  • Более полное описание предметной области приведено здесь.




    Постановка задачи


    Требуется создать простейшую систему складского учета для нескольких складов, которая позволит приходовать и отпускать материалы, а также формировать отчет по остаткам материалов.




    Поведение сформированного отчета


    В системе 1С:Предприятие отчеты могут быть вполне активными объектами. Это означает, что щелкнув например, на сотруднике можно открыть форму этого сотрудника или сформировать более детальный отчет только по этому сотруднику. Это очень удобно для бухгалтеров, которые от сводных отчетов могут перейти к более детальным и узнать, откуда взялась каждая сумма, вплоть до конкретной проводки. Для этого предназначены свойства ячейки Расшифровка и процедура ОбработкаЯчейкиТаблицы.
    Хотя в самом начале этой главы было сказано, что отчеты выводят результаты, на самом деле с помощью таблиц можно организовать ввод информации в базу данных. Это бывает удобно, когда нужна сложная форма для ввода данных.




    Позиция документа


    В крупных многопользовательских системах часто возникает ситуации, когда новые документы записываются почти одновременно, внутри одной секунды. Но все равно не возникает никаких накладок, т.к. документы разделяются внутри секунды с помощью позиции документа. Она представляет собой специальное 32-х символьное выражение, которое можно прочитать с помощью специального метода:
    ПозДокумента = Док.ПолучитьПозицию(); // только чтение !
    Позиция имеется только у записанного документа.




    Правила перерасчета


    «Правила перерасчета» являются вспомогательными объектами метаданных, предназначенными для автоматического отслеживания актуальности результатов проведенных расчетов при вводе новых записей журнала расчетов, удалении существующих или ручном исправлении результата расчета.
    При создании правила перерасчета в Конфигураторе определяются виды расчетов, при редактировании которых правило перерасчета «срабатывает» (едущие виды расчета), и виды расчетов, которые должны быть перерассчитаны при срабатывании данного правила (зависимые виды расчета).
    Например, для организации правильного перерасчета доплат к основным начислениям следует в качестве ведущих видов расчета указать оклад, тариф, сдельная оплата), а в качестве зависимых видов расчета следует указать доплаты к окладу, доплаты к тарифу и т.д.




    Предопределенные процедуры


    вызываются системой 1С при наступлении определенных событий. Предопределенные процедуры вызываются системой 1С при наступлении определенных событий, поэтому они являются обработчиками событий. В версии 8.0 имя процедуры может быть любое, необязательно совпадающее с именем события. Кроме того, в версии 8.0 список событий для всех объектов был значительно расширен.








    Префикс номера


    Если вы используете распределенную базу или желаете, чтобы документы обозначали пользователя, который их создал, полезно пользоваться префиксами - одним или двумя символами, которые подставляются перед собственно номером документа, но при этом "входят" в номер. Не забывайте, что префикс должен быть строковым ("Сч-" или "01", или "1-"), а в свойствах документа должен быть установлен строковый тип номера.
    Док = СоздатьОбъект("Документ.Счет");

    ПрефДок = Лев(ИмяПользователя(),2);

    Док.ПрефиксНомера(ПрефДок + "-");

    Док.Новый();
    Этот метод изменяет префикс по умолчанию, или возвращает текущее значение префикса, если использовать метод без параметра. А вот другая возможность:
    Док = СоздатьОбъект("Документ.Счет");

    ПрефДок = Лев(ИмяПользователя(),2);

    Док.Новый();

    Док.УстановитьНовыйНомер(ПрефДок + "-"); // такая нумерация работает очень корректно
    В отличие от предыдущего этот метод устанавливает (а точнее переустанавливает введенный по умолчанию при исполнении метода Новый()) новый номер с указанным префиксом.




    Приход товара


    Экранная форма документа выглядит следующим образом:
    Приход товара

    При проведении документа производятся движения в регистре Остатки:
    Процедура ОбработкаПроведения()
    ВыбратьСтроки();

    Пока ПолучитьСтроку()=1 Цикл
    Регистр.Остатки.Товар = Товар;

    Регистр.Остатки.Количество = Количество;

    Регистр.Остатки.ДвижениеПриходВыполнить();
    КонецЦикла;
    КонецПроцедуры




    Приходная накладная




    10.2 (Материалы.Покупные полуфабрикаты и комплектующие изделия, конструкции и детали)


    60 (Расчеты с поставщиками и подрядчиками)




    19.3 (Налог на добавленную стоимость.Налог на добавленную стоимость по приобретенным материально-производственным запасам)


    60 (Расчеты с поставщиками и подрядчиками)









    Приходный ордер




    50.1 (Касса.Касса организации)


    62 (Расчеты с покупателями и заказчиками)









    Получить минимальное или максимальное из


    ОкончатЦена = Окр(Цена*0.5, 2);
    Округление.
    Рублей = Цел(Цена);
    Получить целую часть числа.
    ОблНал = Макс(ОблНал-Льготы,0);

    МинЗнач = Мин(значение1,значение2,значение3);
    Получить минимальное или максимальное из значений. Можно передавать несколько параметров (больше двух)
    Длина = СтрДлина("Иванов Иван Иванович");
    Получить длину строки.
    ФИО = СокрЛ(ФИО); //убрать пробелы слева

    ФИО = СокрП(ФИО); //убрать пробелы справа

    ФИО = СокрЛП(ФИО); //убрать пробелы слева и справа
    Отсечение пробелов.
    АБ = Лев("АБВГДЕ",2);

    ГДЕ = Прав("АБВГДЕ",3);

    БВГ = Сред("АБВГДЕ",2,3);
    Вырезание подстроки слева, справа и из середины.
    НомерСимвола = Найти(ФИО, " "); //найти позицию первого пробела
    Поиск вхождения подстроки в строку.
    НоваяСтрока = СтрЗаменить(ПрежняяСтрока," ", "_");
    Замена одной подстроки на другую.
    ФИОЗаглавнымиБуквами = ВРЕГ(ФИО)

    ФИОстрочнымиБуквами = нрег(ФИО)
    Изменение регистра букв.
    СегодняВ1С = РабочаяДата(); //дата в параметрах 1С

    СегодняВСистеме = ТекущаяДата(); //дата в операционной системе

    СейчасВСистеме = ТекущееВремя();
    Получить текущую дату и время.
    НачалоМесяца = НачМесяца(НекаяДата);

    КонецМесяца = КонМесяца(НекаяДата);

    НачалоГода = НачГода(НекаяДата);

    КонецГода = КонГода(НекаяДата);
    Получение начала/конца месяца/года по некой дате.
    Год = ДатаГод(ДатаРождения);

    Месяц = ДатаМесяц(ДатаРождения);

    Число = ДатаЧисло(ДатаРождения);
    Выделить из даты год, месяц и число.
    ДатаЧерезДваМесяца = ДобавитьМесяц(НекаяДата,2);
    Прибавление к дате нескольких месяцев. Если число отрицательное, то отсчет ведется назад.
    ПериодСтрокой = ПериодСтр(Дата1, Дата2);
    Строковое представление периода, например "Январь 2002".
    НекаяДата = Дата("01.01.2002");

    Сообщение = "Месяц " + Строка(НомерМесяца);

    НекоеЧисло = Число("5");
    Преобразование типов.


    СуммаСКопейками = Формат(Сумма,"Ч10.2-");
    Форматирование чисел, сумм и дат. Очень много вариантов форматирования!
    СуммаПрописью = Пропись(Сумма);
    Сумма прописью. Часто применяется в денежных документах.
    Если Вопрос("Вы уверены?","Да+Нет")="Да" Тогда
    Вопрос пользователю. Можно спросить "Да+Нет", "Повтор+Отмена" и т.д.
    Предупреждение("Случилась ошибка!");
    Сообщениию пользователю в виде окошка. Программа приостанавливается, пока пользователь не нажмет ОК.
    Сообщить("Документ проведен!");
    Сообщение пользователю в окно сообщений. Программа работает дальше.
    Состояние("Выполнено на " + Строка(Проценты) + "%");
    Сообщение пользователю в строку статуса.
    глТекущийПользователь = ИмяПользователя();
    Получить имя текущего пользователя.
    Права = НазваниеНабораПрав();
    Получить название набора прав текущего пользователя.
    ТекКаталогБазы = КаталогИБ();
    Получить каталог, где находится информационная база.
    НачатьТранзакцию();
    Если <условие ошибки> Тогда

    ............ОтменитьТранзакцию();

    КонецЕсли;
    ЗафиксироватьТранзакцию();
    Обработка транзакций. Транзакция - это совокупность действий, которая выполняется или вся целиком, или не выполняется ни одно из действий. Т.е. это единый блок действий, который или выполнен целиком, или не выполнен совсем. Транзакции необходимы для сохранения целостности базы данных.
    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
    Возвращает ссылку на объект.
    Если ТипЗначенияСтр(Параметр)="Справочник" Тогда
    Определяет тип значения.


    Простая процедура. После слова КонецПроцедуры


    Процедура РассчитатьНалог(Сотрудник, НекаяДата)
    КонецПроцедуры
    Простая процедура. После слова КонецПроцедуры точка с запятой не нужна, потому что это не оператор, а операторная скобка
    Функция РассчитатьНалог(Сотрудник, НекаяДата)
    Возврат Налог;
    КонецФункции
    Функция должна обязательно возвращать результат.
    Если Оклад > 10000 Тогда

    ......Результат = "Жить можно";

    Иначе

    ......Результат = "Плохо";

    КонецЕсли;
    Простое условие. После слова КонецЕсли должна быть точка с запятой, потому что так заканчивается оператор Если
    Результат = ?(Оклад > 10000, "Нормально","Плохо");
    Сокращенное Если.
    Если Оклад > 10000 Тогда

    ......Результат = "Жить можно";

    ИначеЕсли Оклад > 5000 Тогда

    ......Результат = "Плохо";

    Иначе

    ......Результат = "Так жить нельзя";

    КонецЕсли;
    Множественное условие. Если первое условие не выполняется, то проверяется второе. Если второе условие не выполняется, то третье. Если ни одно из условий не выполняется то выполняется блок Иначе.
    Если (Оклад > 10000) И (КодКатегории = 2) Тогда
    КонецЕсли;
    В составном логическом выражении скобки обязательны! (в версии 8.0 необязательны)
    Пока Номер <= 50 Цикл
    КонецЦикла;
    Простой цикл Пока (цикл с неизвестным числом повторений). После слова КонецЦикла должна быть точка с запятой, потому что так заканчивается оператор Пока
    Для Номер = 1 По 50 Цикл
    КонецЦикла;
    Простой цикл Для (цикл с известным числом повторений).

    В версии 8.0 есть еще цикл Для Каждого (for each).
    Перейти ~метка;
    <...>
    ~метка:
    Так оформляются метки и оператор безусловного перехода (GOTO). Чем меньше в вашей программе будет меток, тем лучше.
    Пока <условие> Цикл
    Если <условие> Тогда

    ........Продолжить;

    КонецЕсли;
    КонецЦикла;
    Оператор Продолжить передает управление в начало цикла.
    Пока <условие> Цикл
    Если <условие> Тогда

    .........Прервать;


    КонецЕсли;
    КонецЦикла;
    Оператор Прервать производит досрочный выход из цикла. Управление передается на операторы после цикла.
    Перем Сотр;
    Явное объявление переменной.
    Номер = 1;
    Переменные можно не объявлять явно. При первом присвоении значения создается новая переменная.
    ФИО = Фамилия + " " + Имя + " " + Отчество;
    Сложение строк (конкатенация)
    НекаяДата = '01.01.2002';
    Переменная, которая хранит дату.
    Перем глТекущийПользователь Экспорт;
    Объявление глобальной переменной в Глобальном модуле. Такие переменные доступны в любом месте конфигурации.
    Попытка
    а = 10 / 0;
    Исключение
    Предупреждение("Деление на ноль!");
    КонецПопытки;
    Обработка исключительных ситуаций.
    Если во время выполнения операторов между словами Попытка и Исключение произошла ошибка, то управление передается на операторы между словами Исключение и КонецПопытки
    Если ошибки не было, то управление передается на операторы после слова КонецПопытки.
    //это комментарий
    Так оформляются комментарии.
    СпрСотр.ВыбратьЭлементы();
    Вызов метода объекта производится как обычно, через точку.


    Пример автоматической процедуры восстановления последовательности


    // получим границу последовательности

    ПозицияНач = СформироватьПозициюДокумента (Последовательность.ОсновнаяПоследовательность.ПолучитьПозицию(), 1);

    Док = СоздатьОбъект("Документ");

    // отберем док-ты посл-ти "ОсновнаяПоследовательность"

    Док.ВыбратьПоПоследовательности(ПозицияНач, ПолучитьПозициюТА(), "ОсновнаяПоследовательность");

    Пока Док.ПолучитьДокумент() = 1 Цикл
    Док.Провести(); // перепроводим документы

    Сообщить("Восстановление последовательности "+Док);
    КонецЦикла;




    Пример использования диаграммы в 1С: Бухгалтерия


    Процедура СформироватьДиаграмму(Диаграмма1)
    // Блокируем обновление, пока обрабатываются данные

    Диаграмма1.Обновление(0);

    Диаграмма1.Заголовок = "Поступления от покупателей";

    Диаграмма1.УстановитьИмяСерии(1, "Рубли");

    Диаграмма1.АвтоУстановкаИменТочек(1);

    // Заполним диаграмму значениями

    БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
    Бухит.ВыполнитьЗапрос(НачКвартала(РабочаяДата()),

    КонКвартала(РабочаяДата()),"60.1",,,1,"Неделя","С");
    БухИт.ВыбратьПериоды();

    А = 1;

    // дебетовые обороты по счету 60.1 покажут поступления

    // денег от покупателей

    Пока БухИт.ПолучитьПериод() = 1 Цикл
    Диаграмма1.УстановитьЗначение(А, 1, БухИт.ДО());

    А = А +1;
    КонецЦикла;
    // после наполнения данными перерисовываем

    Диаграмма1.Обновление(1);
    КонецПроцедуры
    Результат работы процедуры на рис.2:
    Пример использования диаграммы в 1С: Бухгалтерия





    ТекстДок.Открыть("catalog.txt");


    ТекстДок = СоздатьОбъект("Текст");

    ТекстДок.Открыть("catalog.txt");

    ТекстДок.ЗаменитьСтроку(52, "Установка оборудования......" + Стоимость);

    ТекстДок.ВставитьСтроку(53, "Замена оборудования... ");

    ТекстДок.УдалитьСтроку(10);

    ТекстДок.ДобавитьСтроку("Конец файла");
    ТекстДок2 = СоздатьОбъект("Текст");

    ТекстДок2.Шаблон(1);
    Для н = 1 По ТекстДок.КоличествоСтрок(1) Цикл

    ..........стр = ТекстДок.ПолучитьСтроку(н);

    ..........стр2 = "[н]" + стр;

    .........ТекстДок2.ДобавитьСтроку(стр2);

    КонецЦикла;

    ТекстДок2.Записать("catalog2.txt");

    ТекстДок2.ТолькоПросмотр(1);

    ТекстДок2.Показать();



    Диаграмма предоставляет удобное графическое представление


    Пример 1

    //переместить все текстовые файлы (*.txt) из каталога информационной базы в каталог TXT.
    ФС.УстТекКаталог(КаталогИБ());

    ИмяФайла = "";

    ИмяФайла = ФС.НайтиПервыйФайл("*.txt");

    Если ИмяФайла <> "" Тогда

    .... ФС.СоздатьКаталог("TXT");

    .....ФС.КопироватьФайл(ИмяФайла,ФС.ТекКаталог() + "TXT" + ИмяФайла);

    .....ФС.УдалитьФайл(ИмяФайла);

    Пока 1=1 Цикл
    ИмяФайла = " ";

    .....ИмяФайла = ФС.НайтиСледующийФайл()

    Если ИмяФайла <> "" Тогда

    .....ФС.КопироватьФайл(ИмяФайла,ФС.ТекКаталог() + "TXT" + ИмяФайла);

    .....ФС.УдалитьФайл(ИмяФайла);

    Иначе

    ..... Прервать;

    КонецЕсли;
    КонецЦикла;

    Пример 2

    //выбрать файл с фотографией сотрудника
    ИмяФайла = "";

    ИмяКаталога = КаталогИБ();
    Если ФС.ВыбратьФайлКартинки(0,ИмяФайла,ИмяКаталога,"Укажите файл с фотографией:",,20)=1 Тогда
    ВремКартинка = СоздатьОбъект("Картинка");

    ВремКартинка.Загрузить(ИмяКаталога + ИмяФайла);

    КартинкаНаФорме.УстановитьКартинку(ВремКартинка);
    КонецЕсли;
    Диаграмма предоставляет удобное графическое представление некоторого набора данных, чаще всего результатов каких-либо изменений. 1С предоставляет собственный (надо сказать, приятный) инструмент такого графического представления - объект "Диаграмма". Область диаграммы состоит из нескольких частей: область построения (там создается рисунок), заголовка (надписи над рисунком), легенды (расшифровки меток серий). В диаграмме имеются серии (т.е. наборы значений) и точки, из которых состоят серии (см. рис.1).



    Полный список предопределенных процедур


    Предопределенные процедуры глобального модуля
    ПриНачалеРаботыСистемы()

    ПриЗавершенииРаботыСистемы()

    ПриЗаписиКонстанты()

    ПриЗаписиИстории()

    ПриСменеРасчетногоПериода()
    Модуль формы списка справочника
    ПриОткрытии()

    ПриЗакрытии()

    ПриЗаписи()

    ПриВводеСтроки()

    ПриВыбореРодителя()

    ПриВыбореВладельца()
    Модуль формы элемента справочника
    ВводНового()

    ПриЗаписи()
    Модуль журнала документов
    ПриУстановкеИнтервала()

    ПриУстановкеОтбора()
    Модуль формы документа
    ВводНового()

    ВводНаОсновании()

    ПриЗаписи()

    ПриВводеСтроки()

    ПриУдаленииСтроки()
    Модуль документа
    ОбработкаПроведения()

    ОбработкаУдаленияПроведения()

    АрхивироватьДокумент()
    Модуль журнала расчетов
    ПриУстановкеОтбора()

    ПриИсправленииРезультата()

    ПриВыбореВладельца()
    Модуль вида расчета
    ПровестиРасчет()
    Модуль журнала операций
    ПриУстановкеОтбора()

    ПриУстановкеИнтервала()
    Модуль формы операции
    ВводНового()

    ПриЗаписи()

    ПриВводеСтроки()

    ПриУдаленииСтроки()
    Модуль журнала проводок
    ПриУстановкеОтбора()

    ПриУстановкеИнтервала()

    ПриПоказеПроводокПоДокументу()
    Предопределенные процедуры для Таблиц
    ОбработкаЯчейкиТаблицы()

    ПриВыбореЯчейкиТаблицы()
    Модуль формы списка счетов
    ПриВводеСтроки()

    ПриВыбореРодителя()

    ПриЗаписи()
    Модуль формы счета
    ВводНового()

    ПриЗаписи()
    Для организации подбора
    ОбработкаПодбора()
    Полный список предопределенных процедур и их параметров см. в Синтакс-помощнике.



    Присоединить секцию


    Присоединить секцию -- означает прицепить ее к таблице справа.
    Таб.ВывестиСекцию("НомерПП");

    Для Месяц = 1 По 12 Цикл

    .......Таб.ПрисоединитьСекцию("Месяц");

    КонецЦикла;

    Таб.Показать()





  • Создаем новый справочник;


  • Идентификатор - "Единицы", Комментарий - "единицы измерения товара";


  • В интерфейс вставлять не будем, это служебный справочник;


  • [Готово]. Появилось окно свойств справочника;


  • ГЛАВНОЕ: В поле подчинен выбираем справочник "Номенклатура". Этим мы и указываем характер их отношений;

    <title>(.*)</title>


  • Количество уровней - 1, следовательно групп у нас не будет, и зачем?. Длина кода - 5, длина наименования - 0. Мы не будем использовать это поле за ненадобностью. Серии кодов в пределах подчинения, тип кода - текст, сюда мы будем заносить текстовое представление названия единицы измерения, основное представление - код (другого варианта и нет). Автоматическая нумерация и контроль уникальности нам не нужны;


  • Занесем два новых реквизита: Первый - "Ед", тип - П.ЕдИзм. Второй - "Коэффициент", тип Число 5.0, неотрицательный;


  • Редактировать будем в диалоге;


  • Создаем форму элемента;


  • Если Вы обратили внимание, предопределенное поле Наименование нам для выбора не предложили, это потому, что мы указали его длину = 0;


  • Расставим поля как-нибудь поудобнее, но можем оставить и так;


  • Поле ввода кода сделаем недоступным - сюда мы будем, как и договорились ранее, автоматически заносить строковое представление названия единицы измерения;


  • Пусть поле ввода "Коэффициент" у нас будет с кнопкой выбора - так симпатичнее;


  • В поле ввода "Ед" добавим в формулу процедуру Ед();


  • В модуле формы пишем код процедуры Ед():

    Процедура Ед()

    Код=Строка(Ед);

    // Здесь функцией Строка() мы получаем строковое

    // представление значения перечисления

    КонецПроцедуры


  • Еще мы хотим при вводе новой единицы измерения нам по умолчанию бы ставилось то значение, которое стоит у товара-владельца в качестве основного, ну соответственно и коэффициент должен ставиться равным единице. Пишем знакомую уже нам предопределенную процедуру:

    Процедура ВводНового()

    Ед=Владелец.ЕдИзм;

    // А вот это важно. Здесь "Владелец" это указание на запись в справочнике



    // "Номенклатура", которой будет принадлежать эта единица измерения

    Коэффициент=1;

    Код=Строка(Ед);

    КонецПроцедуры

    В 1С ссылки на реквизиты таблиц имеют такой же вид как и ссылки на атрибуты и методы объектов (через "."), а не как в VBA, где используется "!";


  • Для закрепления информации о ссылке "Владелец" внесем текстовое поле, которое в форме элемента будет нам выводить код и наименование товара-владельца:


  • В диалоге вставим из меню Вставить командой "Текст" текстовое поле;


  • В окошке свойств этого текста очистим поле "Заголовок";


  • На закладке "Дополнительно" введем формулу "("+СокрЛП(Владелец.Код)+") "+СокрЛП(Владелец.Наименование)

    Здесь СокрЛП() - это функция, которая удаляет пробелы в конце и в начале текстовой строки, "(" - текстовое выражение в коде в 1С заключают в кавычки, + в 1С служит и знаком конкатенации текстовых выражений;


  • На закладке "Шрифт" выберем какой нибудь шрифт и оформление по нашему вкусу;


  • Нажмем [ОК];


  • Разместим это текстовое поле где ни будь сверху формы;


  • Скопируем это текстовое поле в буфер обмена;


  • Форма элемента готова. Закроем ее;


  • Создадим форму списка;


  • Растянем поля пошире, чтоб заголовки полей были видны полностью, и вставим наверх из буфера обмена текстовое поле;


  • Форму списка можно закрыть;


  • Сохраняем изменения и входим в 1С:Предприятие;


  • Войдем в справочник номенклатуры;


  • Найдем "Кефир" и установим на него курсор;


  • Из меню Действия командой "Подчиненный справочник" вызовем справочник "Единицы". Если бы у нас было несколько справочников подчиненных справочнику товаров, то нам пришлось бы выбирать из списка;


  • Введем новый элемент. Это будет элемент с базовой единицей. Ничего изменять не будем и сохраним его;


  • Теперь введем еще один элемент - с производной единицей измерения;


  • Единица Ц ящик (ящ.), коэффициент - 15;


  • В списке единиц у нас две записи;


  • Переключимся в справочник товаров и установим курсор на яблоках;




  • Возвращаемся в справочник единиц - он пуст. Две единицы, что мы только что ввели относятся к кефиру, соответственно в списке записей относящихся к яблокам их и не должно быть;


  • Введем аналогичным образом две записи для яблок: килограмм (кг.) коэффициент - 1, ящик (ящ.) коэффициент - 25;


  • Для остальных товаров внесем записи, как было сказано в начале главы. Обратите внимание, мы не можем создать подчиненные записи к элементу типа группа;


  • Разместив на экране рядом справочники товаров и единиц и переходя курсором по записям о товарах, мы можем видеть как в справочнике единиц меняются наборы записей;


  • Закроем справочник товаров. Установим курсор в справочнике единиц на любой записи;


  • Через меню Действия выполним команду "Иерархический список";


  • В справочнике единиц стало видно сразу множество записей;


  • Переходя по ним курсором, мы видим как меняется содержание текстового поля вверху списка, где мы указали выводить код и наименование владельца;


  • Остановимся на какой либо из записей;


  • Через меню Действия выполним команду "Иерархический список";


  • Снова в списке остались только записи относящиеся к какому-то одному товару;


  • Через меню Действия выполним команду "Справочник-владелец";


  • Открылся справочник товаров. Курсор в нем установился на том товаре, который являлся владельцем текущей единицы измерения;


  • Если мы будем выключать-включать иерархический список в справочнике товаров, то мы будем видеть соответственно либо все товары и группы сразу, либо только относящиеся к текущей группе/подгруппе;


  • Закроем 1С:Предприятие.



  • Продукты




    Кефир жирность 1.5% МПР-0342


    6.90


    9.32


    шт.




    Яблоки "Голден" ФРЯ-908


    17.50


    25


    кг.


  • Теперь нажмем [Печать] в форме списка справочника. Это будет выглядеть примерно так. Любуемся результатом;

    Продукты

  • Полученную табличную печатную форму мы можем послать на принтер;

  • Выходим из 1С:Предприятия. Так как сохранить изменения в конфигураторе мы можем только если ВСЕ пользователи выйдут из программы 1С:Предприятие. Не вышедших можно найти, если воспользоваться Монитором, но и он ничего не покажет, если кто-то открыл окно для ввода имени пользователя и пароля и не вошел. Таких надо учить...

  • 2.6 Продолжение работы с товарами.
    У нас есть справочник номенклатуры. В нем у каждого товара мы указали основную единицу измерения. Но мы ведь можем работать и с большими количествами. Например мы можем продать ящик яблок, в ящике, к примеру, 25 кг. Или ящик с тарелками, где их 12 штук. Мы можем пользоваться и другими единицами, если их занесем, соответственно, как значения перечисления ЕдИзм. Это не возбраняется. Хорошо посмотреть "Общероссийский классификатор единиц измерения". Но вернемся к нашей программе. Мы пришли к выводу, что нам необходимо как-то указать, что товар может измеряться не только в базовой единице, но и в каких-то кратных ей других единицах измерения. Так яблоки у нас будут либо в килограммах, либо в ящиках по 25 кг., тарелки либо в штуках, либо в ящиках комплектом на дюжину персон, кефир либо в пакетах по 1 штуке, либо в ящиках по 15 штук пакетов.

    Эта задача в 1С решается следующим способом. Мы заведем новый справочник подчиненный справочнику товаров. Подчиненность означает, что каждая запись справочника товаров может иметь, принадлежащие только ей, одну, либо несколько, либо вообще не иметь, записей в подчиненном справочнике. Тут неплохо ознакомится с теорией реляционных баз данных. Литературы по этому вопросу есть много. Например книги Баркера, любая книжка по MS Access для начинающих и т.д.

    Опишем каким мы хотим видеть наш подчиненный справочник. Название ему дадим "Единицы". В нем должны быть перечислены единицы измерения товара, включая базовую, и коэффициенты пересчета этих единиц в базовую, для базовой это "1". Реализуем нашу идею.



  • Создаем новый справочник;


  • Идентификатор - "Единицы", Комментарий - "единицы измерения товара";


  • В интерфейс вставлять не будем, это служебный справочник;


  • [Готово]. Появилось окно свойств справочника;


  • ГЛАВНОЕ: В поле подчинен выбираем справочник "Номенклатура". Этим мы и указываем характер их отношений;

    Продукты


  • Количество уровней - 1, следовательно групп у нас не будет, и зачем?. Длина кода - 5, длина наименования - 0. Мы не будем использовать это поле за ненадобностью. Серии кодов в пределах подчинения, тип кода - текст, сюда мы будем заносить текстовое представление названия единицы измерения, основное представление - код (другого варианта и нет). Автоматическая нумерация и контроль уникальности нам не нужны;


  • Занесем два новых реквизита: Первый - "Ед", тип - П.ЕдИзм. Второй - "Коэффициент", тип Число 5.0, неотрицательный;


  • Редактировать будем в диалоге;


  • Создаем форму элемента;


  • Если Вы обратили внимание, предопределенное поле Наименование нам для выбора не предложили, это потому, что мы указали его длину = 0;


  • Расставим поля как-нибудь поудобнее, но можем оставить и так;


  • Поле ввода кода сделаем недоступным - сюда мы будем, как и договорились ранее, автоматически заносить строковое представление названия единицы измерения;


  • Пусть поле ввода "Коэффициент" у нас будет с кнопкой выбора - так симпатичнее;


  • В поле ввода "Ед" добавим в формулу процедуру Ед();


  • В модуле формы пишем код процедуры Ед():

    Процедура Ед()

    Код=Строка(Ед);

    // Здесь функцией Строка() мы получаем строковое

    // представление значения перечисления

    КонецПроцедуры


  • Еще мы хотим при вводе новой единицы измерения нам по умолчанию бы ставилось то значение, которое стоит у товара-владельца в качестве основного, ну соответственно и коэффициент должен ставиться равным единице. Пишем знакомую уже нам предопределенную процедуру:

    Процедура ВводНового()

    Ед=Владелец.ЕдИзм;

    // А вот это важно. Здесь "Владелец" это указание на запись в справочнике



    // "Номенклатура", которой будет принадлежать эта единица измерения

    Коэффициент=1;

    Код=Строка(Ед);

    КонецПроцедуры

    В 1С ссылки на реквизиты таблиц имеют такой же вид как и ссылки на атрибуты и методы объектов (через "."), а не как в VBA, где используется "!";


  • Для закрепления информации о ссылке "Владелец" внесем текстовое поле, которое в форме элемента будет нам выводить код и наименование товара-владельца:


  • В диалоге вставим из меню Вставить командой "Текст" текстовое поле;


  • В окошке свойств этого текста очистим поле "Заголовок";


  • На закладке "Дополнительно" введем формулу "("+СокрЛП(Владелец.Код)+") "+СокрЛП(Владелец.Наименование)

    Здесь СокрЛП() - это функция, которая удаляет пробелы в конце и в начале текстовой строки, "(" - текстовое выражение в коде в 1С заключают в кавычки, + в 1С служит и знаком конкатенации текстовых выражений;


  • На закладке "Шрифт" выберем какой нибудь шрифт и оформление по нашему вкусу;


  • Нажмем [ОК];


  • Разместим это текстовое поле где ни будь сверху формы;


  • Скопируем это текстовое поле в буфер обмена;


  • Форма элемента готова. Закроем ее;


  • Создадим форму списка;


  • Растянем поля пошире, чтоб заголовки полей были видны полностью, и вставим наверх из буфера обмена текстовое поле;


  • Форму списка можно закрыть;


  • Сохраняем изменения и входим в 1С:Предприятие;


  • Войдем в справочник номенклатуры;


  • Найдем "Кефир" и установим на него курсор;


  • Из меню Действия командой "Подчиненный справочник" вызовем справочник "Единицы". Если бы у нас было несколько справочников подчиненных справочнику товаров, то нам пришлось бы выбирать из списка;


  • Введем новый элемент. Это будет элемент с базовой единицей. Ничего изменять не будем и сохраним его;


  • Теперь введем еще один элемент - с производной единицей измерения;


  • Единица Ц ящик (ящ.), коэффициент - 15;


  • В списке единиц у нас две записи;


  • Переключимся в справочник товаров и установим курсор на яблоках;




  • Возвращаемся в справочник единиц - он пуст. Две единицы, что мы только что ввели относятся к кефиру, соответственно в списке записей относящихся к яблокам их и не должно быть;


  • Введем аналогичным образом две записи для яблок: килограмм (кг.) коэффициент - 1, ящик (ящ.) коэффициент - 25;


  • Для остальных товаров внесем записи, как было сказано в начале главы. Обратите внимание, мы не можем создать подчиненные записи к элементу типа группа;


  • Разместив на экране рядом справочники товаров и единиц и переходя курсором по записям о товарах, мы можем видеть как в справочнике единиц меняются наборы записей;


  • Закроем справочник товаров. Установим курсор в справочнике единиц на любой записи;


  • Через меню Действия выполним команду "Иерархический список";


  • В справочнике единиц стало видно сразу множество записей;


  • Переходя по ним курсором, мы видим как меняется содержание текстового поля вверху списка, где мы указали выводить код и наименование владельца;


  • Остановимся на какой либо из записей;


  • Через меню Действия выполним команду "Иерархический список";


  • Снова в списке остались только записи относящиеся к какому-то одному товару;


  • Через меню Действия выполним команду "Справочник-владелец";


  • Открылся справочник товаров. Курсор в нем установился на том товаре, который являлся владельцем текущей единицы измерения;


  • Если мы будем выключать-включать иерархический список в справочнике товаров, то мы будем видеть соответственно либо все товары и группы сразу, либо только относящиеся к текущей группе/подгруппе;


  • Закроем 1С:Предприятие.





  • Программное создание группы


    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    СпрСотр.НоваяГруппа();

    СпрСотр.Наименование = "Работающие";

    СпрСотр.Записать();

    СпрСотр.НоваяГруппа();

    СпрСотр.Наименование = "Уволенные";

    СпрСотр.Записать();




    Программное создание элемента справочника


    Ниже в справочник Сотрудники программно добавляется новый сотрудник в группу Работающие. В справочнике заполняется поля Наименование, ДатаПриема и пара периодических реквизитов.








    Пром. товары




    Мебель




    Стол на 6 персон СТО-023


    2500


    3375


    шт.




    Стул мягкий СТУ-012


    780


    1050


    шт.




    Посуда




    Супница расписная СУП-004


    87.25


    118


    шт.




    Тарелка глубокая ТАР-123


    18.75


    25


    шт.









    Простейший кадровый учет


    Сейчас мы создадим мини-систему кадрового учета сотрудников предприятия. Она позволит принимать и увольнять сотрудников, а также работать с кадровыми документами.
    Каждая конфигурация должна храниться в отдельном каталоге (папке).
    1. Создайте новую папку на любом диске, например, "C:\Учебная"

    2. Запустите 1С:Предприятие. Откроется список информационных баз.
    Простейший кадровый учет

    1С:Предприятие может работать с несколькими базами данных на одном компьютере. Например, в одной базе ведется кадровый учет, в другой базе - учет товаров, в третьей - бухгалтерский учет для Фирмы А, в четвертой - бухгалтерский учет для фирмы Б.
    3. Нажмите кнопку Добавить. Укажите имя информационной базы, как оно будет отображаться в списке баз, например "Учебная". Имя базы может быть произвольным, от него ничего не зависит.
    Простейший кадровый учет

    4. В следующем поле укажите путь к папке, которую вы создали на 1 шаге. Нажмите кнопку "…", войдите в папку и нажмите Выбрать.
    Простейший кадровый учет

    Папка может располагаться на локальном жестком диске компьютера, например "C:\Учебная" или на другом компьютере в сети, например, "\\SERVER\KADR". При этом должны быть предоставлены полные права доступа к этой папке (чтение, запись и т.д.).
    5. Нажмите ОК. В списке информационных баз появится новая строка. Для ее редактирования можно нажать кнопку Изменить. Например, информационную базу перенесли в другое место или вы хотите задать другое название для информационной базы. Для удаления информационной базы из списка нужно нажать кнопку Удалить. При этом информационная база удаляется из списка, но не удаляется физически с диска.
    6. Укажите режим запуска Конфигуратор.
    Простейший кадровый учет

    1С может запускаться в четырех режимах:
  • Предприятие - режим использования информационной базы. В этом режиме работают обычные пользователи, вводят данные, печатают отчеты и т.д. В этом режиме нельзя редактировать структуру конфигурации.

  • Конфигуратор - режим конфигурирования (программирования). В этом режиме работают программисты, создают новые справочники, отчеты, пишут программные модули. Вводить данные в информационную базу в этом режиме нельзя.




  • Монитор - режим наблюдения за пользователями, работающими в данный момент с информационной базой. Все операции с информационной базой регистрируются в Журнале регистраций. В режиме Монитор можно получить протокол всех операций совершенных конкретным пользователем, над конкретным объектом, а также можно задать другие условия фильтра.


  • Отладчик - режим для программистов, когда у них что-то не ладится с программой. Здесь можно отследить как выполняется программа буквально по шагам. При этом программа выполняется в режиме Предприятие.


  • 7. Нажмите ОК для запуска базы в режиме конфигуратор.

    8. Так как в созданной папке пока ничего нет, то 1С спросит в каком формате будет храниться база данных: В файлах DBF или на SQL-Server Укажите формат "Файлы DBF" и нажмите ОК.

    Простейший кадровый учет


    9. Запустится конфигуратор. Откройте дерево конфигурации, в котором мы будем работать очень часто. Для этого щелкните меню Конфигурация => Открыть конфигурацию или кнопочку
    Простейший кадровый учет
    . Появится окно дерева конфигурации. Задайте ему нормальные размеры.

    Простейший кадровый учет


    В этом окне представлены все объекты конфигурации, такие как справочники, документы, отчеты и т.д. Для раскрытия какой-то ветки нужно два щелкнуть на плюсике или два раза щелкнуть на ее названии.

    Создание объектов конфигурации

    10. Установите курсор на строку Справочники и щелкните кнопку
    Простейший кадровый учет
    (или щелкните правой кнопкой мыши и выберите Новый справочник). При этом откроется окно Конструктора справочников.

    Простейший кадровый учет


    Конструктуры предназначены для помощи программисту в выполнении определенных действий. Только что мы увидели конструктор справочников. В 1С есть еще конструктур документов, конструктор отчетов, конструктор запросов и т.д. Все действия, которые делает конструктор, можно выполнить вручную, но возможно, что с конструктором будет быстрее. Если вам конструктор не нужен (или не нравится), тогда снимите флажок "Использовать конструкторы при создании новых объектов". В данном Учебнике мы все будем делать вручную, поскольку только так можно стать настоящим программистом и выжать из 1С все, на что она способна (или он? кстати, какого рода слово "1С". Это он, она или оно?).



    11. Снимите флажок " Использовать конструкторы при создании новых объектов" и нажмите кнопку Отмена для закрытия конструктора. Он будет сопротивляться, но вы будьте настойчивы!

    Потом вы всегда можете опять запустить конструктор из меню Конструкторы, но мы будем стараться делать все ручками.

    12. Опять установите курсор на строку Справочники и щелкните кнопку
    Простейший кадровый учет
    (или щелкните правой кнопкой мыши и выберите Новый справочник). При этом откроется окно Конструктора справочников уже не откроется, а появится обычное окно для редактирования структуры справочника.

    Простейший кадровый учет


    13. Задайте идентификатор справочника (имя), например сейчас мы создадим справочник "Должности".

    Идентификатор справочника очень важен, поскольку он будет использоваться при программировании. Его нельзя будет исправить просто так, поскольку придется также исправить все места в программе, где используется этот справочник. Относитесь к идентификатору справочника очень серьезно. Идентификатор должен быть лаконичным, понятным, отражающим содержимое справочника, например: "Страны", "Сотрудники", "Товары" и т.д.

    Заметьте, что общепринятым правилом является множественное число в имени справочника, но это не обязательно. Например, вы можете создать справочник "АдреснаяКнига". В идентификаторах объектов, а также в названиях переменных не может быть пробелов, но могут быть цифры и знак подчеркивания. Идентификатор не может начинаться с цифры. Правильное название объектов, переменных - признак хорошего стиля программирования и залог успеха. Будьте профессионалами в этом деле!

    14. Задайте длину наименования 30 символов.

    У каждого справочника есть уже заранее заданные два поля "Код" и "Наименование". Вы можете редактировать длину наименования, длину кода, а тажке тип кода: Числовой/Текстовый.

    15. Закройте окно структуры справочника Должности.

    14. На всякий случай сохраните конфигурацию, чтобы ваш труд не пропал даром, если вдруг отключится электричество или прямо сейчас наступит конец света.



    1С обнаружит, что конфигурация абсолютно новая и у нее нет даже такой вещи, как словаря данных! Пусть создает этот словарь, если он ей очень нужен.

    Простейший кадровый учет


    Нажмите Да.

    Так как мы редактировали структуру информационной базы, то 1С попросит разрешение на реорганизацию информационной базы. В больших конфигурациях (программах) это может быть очень длительный и сложный процесс, у нас пока все просто.

    Простейший кадровый учет


    Нажимаем Да.

    1С проанализирует структуру базы и покажет окно со списком изменений.

    Простейший кадровый учет


    Нажмите кнопку "Принять".

    После реорганизации базы появится сообщение "Реорганизация информациии закончена ".

    15. Создадим справочник Сотрудники. (Установите курсор на Справочники и щелкните кнопку Новый). Задайте имя справочника (идентификатор) "Сотрудники".

    16. Задайте длину наименования 100 символов.

    В наименовании у нас будет храниться ФИО сотрудника. Иногда бывают довольно длинные имена, например "Александровский-Петровский Александр Александрович".

    Простейший кадровый учет


    17. В этом справочнике у нас будет еще одно поле (реквизит, атрибут) Должность. Список реквизитов сейчас пустой. Нажмите кнопку Добавить, откроется окно редактирования свойств реквизита. Кстати, реквизит, атрибут и поле - это в принципе одно и то же. Просто нужно привыкнуть к слову "реквизит".

    Простейший кадровый учет


    18. Задайте имя реквизита "Должность". Укажите тип реквизита "Справочник.Должности", который мы создали раньше. Это говорит о том, что значения данного реквизита будут выбираться из справочника Должности. Нажмите ОК.

    19. Создайте реквизит Оклад (тип Число, Точность 2 знака после запятой)

    Простейший кадровый учет


    20. Создайте реквизиты ДатаПриема и ДатаУвольнения (тип Дата)

    21. Сохраните конфигурацию (на всякий случай).

    Теперь у нас есть два справочника и можно ввести некоторые данные.

    22. Запустите 1С:Предприятие в режиме Предприятие. Это можно сделать прямо из Конфигуратора, нажав кнопку
    Простейший кадровый учет
    . Появится окно 1С:Предприятие.

    Простейший кадровый учет


    23. Откройте справочник Должности. Для этого щеклните меню Операции => Справочники => Должности. Откроется окно справочника.



    Простейший кадровый учет


    Для более быстрого доступа к справочнику позже мы создадим меню, а пока только так.

    24. Введите несколько должностей, используя кнопку
    Простейший кадровый учет
    или клавишу INS. Например, Директор, Бухгалтер, Программист.

    Заметьте, что коды присваиваются автоматически, хотя их можно редактировать. При этом необходимо соблюдать уникальность кодов. Параметры уникальности можно настраивать в конфигураторе, например можно ее вообще отключить, если она не нужна.

    По умолчанию установлена сортировка по Наименованию. Это позволяет набрать первые буквы названия должности и курсор автоматически перейдет на нужную должность. Можно установить и другой тип сортировки: по коду или по реквизиту. Для этого нужно щелкнуть правой кнопкой и выбрать Сортировка. Мы этого делать не будем и оставим все, как есть.

    25. Закройте справочник Должности и откройте справочник Сотрудники. (Щеклните меню Операции => Справочники => Сотрудники).

    Простейший кадровый учет


    26. Заведите нескольких сотрудников. Например, Иванов - директор, Петров - Бухгалтер, Сидоров - Программист.

    Заметьте, что при указании должности открывается справочник Должности. Для выбора должности вам нужно два раза на нее щелкнуть.

    Простейший кадровый учет


    В реальной жизни принятие сотрудника на работу производится кадровым документом "Приказ о приеме на работу". Поэтому сейчас мы это организуем.

    27. Закройте 1С:Предприятие и запустите базу в режиме Конфигуратор.

    28. Теперь создайте новый документ "ПриемНаРаботу". (установите курсор на Документы и щелкните Новый). Задайте имя документа ПриемНаРаботу.

    Простейший кадровый учет


    29. Добавьте реквизит шапки "ФИО", укажите ему тип значения Строка и длина 100 символов. Нажмите ОК.

    У документа есть шапка и табличная часть. В шапке содержатся реквизиты, которые относятся к документу в целом, например НомерДок, ДатаДок и т.д. В табличной части содержатся строки. Например, один документ Накладная содержит информацию по нескольким товарам. Такая ситуация в 1С предусмотрена. (правда не предусмотрена ситуация, когда в документе есть две или даже несколько табличных частей)



    Кстати, у любого документа уже есть два заранее заданных реквизита шапки "НомерДок" и "ДатаДок".

    Далее нужно создать таким же образом, как и реквизит "ФИО", остальные реквизиты и укажите для каждого из них правильный тип:

  • рекв. Должность - тип "Справочник.Должности"


  • рекв. Оклад - тип Число, длина 10, точность 2


  • рекв. ДатаПриема - тип Дата


  • 30. У документа должна быть удобная форма для ввода данных. Нажмите кнопку "Форма" в нижней части окна.

    31. Так как мы сюда зашли в первый раз, то 1С предлагает автоматически создать форму документа.

    Простейший кадровый учет


    Мы договорились все делать вручную, поэтому нажимаем Отмена.

    32. Нам нужно создать форму следующего вида:

    Простейший кадровый учет


  • Установите подходящие размеры формы.

    · Разместите на форме текстовую надпись "Прием на работу". Для этого щелкните на кнопку
    Простейший кадровый учет
    внизу и затем на форме.


  • Кстати, рядом с этой кнопкой есть и другие элементы управления, которыми мы будем пользоваться в дальнейшем: кнопки, поля, переключатели, флажки и т.д.

  • Укажите размер шрифта побольше, это же все-таки заголовок. Для этого щелкните правой кнопкой на надписи, выберите Свойства, щелкните вкладку Шрифт, снимите флажок "Шрифт по умолчанию" и укажите размер шрифта 12, Можете еще что-нибудь указать, например Цвет, жирность и т.д. Не бойтесь экспериментировать, мы же пока только учимся. нажмите ОК.


  • Простейший кадровый учет


  • Добавьте поле НомерДок на форму. Для этого щелкните кнопку
    Простейший кадровый учет
    появится окно. В нем установите флажок у реквизита шапки НомерДок, нажмите ОК и щелкните в каком-нибудь месте формы. Там появится поле НомерДок. Задайте ему размеры и перетащите в нужное место формы.

    · Добавьте рядом текстовое поле с надписью "№".

    · Аналогичным образом разместите на форме остальные реквизиты: ДатаДок, ФИО, Должность. Не забудьте рядом с ними разместить текстовые надписи.

    · Кнопки ОК и Закрыть разместите по центру формы (по горизонтали). Для этого выделите их мышкой (обе одновременно) и щелкните кнопку
    Простейший кадровый учет
    . Попробуйте там и другие кнопки ради интереса.




  • Теперь в этот документ можно будет вводить данные о новом сотруднике. Затем пользователь нажмет кнопку ОК и ваша программа должна добавить в справочник Сотрудники новый элемент (новую строку). При нажатии ОК документ сначала будет записан, а потом будет проведен.

    Проведение документов - очень важное понятие. Провести документ для пользователя означает пустить его в дело. При проведении документа совершаются изменения в информационной базе: добавлются данные в таблицы, увеличиваются или уменьшаются остатки товаров на складе, создаются новые бухгалтерские проводки и т.д.

    Что конкретно произойдет при проведении документа определяется программистом. При проведении выполнится предопределенная процедура ОбработкаПроведения(). Именно в этой процедуре программист пишет программу, которая и совершает все изменения в системе. Сейчас нам нужно до нее добраться. Она хранится в "Модуле документа".

    Для открытия модуля документа закройте экранную форму документа. На экране останется окно структуры документа. Внизу есть кнопка "Модуль документа", вот на нее и нажмите. Откроется окно для редактирования текста программы.

    Там уже есть процедура ОбработкаПроведения, но внутри нее пока ничего существенного. Напишите там следующий текст, пока не вникая в его смысл.

    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    СпрСотр.Новый();

    СпрСотр.Наименование = ФИО;

    СпрСотр.Должность = Должность;

    СпрСотр.Оклад = Оклад;

    СпрСотр.ДатаПриема = ДатаПриема;

    СпрСотр.Записать();

    Простейший кадровый учет


    Хотя, если присмотреться, то можно кое-что понять. Первая строка обращается к справочнику Сотрудники. Вторая строка создает новый элемент, пока пустой. Потом заполняются реквизиты справочника, данные берутся из документа и переносятся в справочник. И в конце происходит запись измененного элемента в справочник.

    Кстати, часто начинающие программисты забывают вызвать Записать(). Не попадайте в эту ловушку! Если вы не вызовете метод Записать(), то все ваши изменения не сохранятся в базе.



    Обратите внимание, что каждый оператор в языке 1С заканчивается символом ";" (точка с запятой). После слова КонецПроцедуры точки с запятой не, потому что это не оператор, а операторная скобка (есть такое понятие в 1С). Точки с запятой нет также после слов Цикл и Тогда, но после слов КонецЦикла и КонецЕсли обязательно ставьте точку с запятой. В данной программе мы не использовали ни циклы, ни условия.

    Также обратите внимание как оформляются комментарии.

    // это комментарий

    Комментарии не учитываются компилятором и предназначены для человека, которому нужно разобраться в программе. Комментариев не должно быть слишком много и слишком мало. Программа сама по себе должна быть понятна, без комментариев. Но в сложных местах в комментариях можно пояснить логику работы программы. Написание комментариев и понятных программ - тоже признак хорошего тона. Будьте в этом деле профессионалами!

    · Закройте окно модуля и окно структуры документа. Сохраните конфигурацию.

    Теперь можно попробовать принять нового сотрудника по всей форме.

    · Запустите 1С в режиме Предприятие.

    Все документы хранятся в журналах документов. Может быть вы не обратили внимание, но для документа "ПриемНаРаботу" был задан журнал по умолчанию "Прочие". Потом мы создадим специальный журнал для всех кадровых документов, а пока будем пользоваться тем, что есть.

  • Для открытия журнала документов Прочие щелкните Операции => Журналы документов => Прочие. Откроется журнал документов.


  • Простейший кадровый учет


  • Щелкните кнопку
    Простейший кадровый учет
    или нажмите клавишу INS. Откроется форма документа "Прием на работу" для ввода данных. Номер документа присвоится автоматически, дата документа - сегодняшнее число.


  • Простейший кадровый учет


  • Введите все данные: ФИО сотрудника, укажите ему должность и оклад.

    · Нажмите кнопку ОК. Сначала документ будет записан, а потом проведен. При проведении сработает процедура ОбработкаПроведения и в справочник Сотрудники добавится новая строка. Проверьте это.


  • Если вдруг выскочит ошибка, значит вы неправильно написали программу. Опять запускайте Конфигуратор и все перепроверяйте.



    Можно сделать так, чтобы 1С проверяла программу на синтаксические ошибки автоматически при сохранении конфигурации. Для этого в Конфигураторе щелкните меню Сервис => Параметры и установите флажок "Проверять ошибки автоматически".

    Заметьте, что отсутствие синтаксических ошибок не гарантирует того, что программа правильная. В ней по-прежнему могут быть ошибки. Такие ошибки могут выскочить при выполнении программы, а могут быть очень скрытые. Ошибки - главная беда программистов. Но еще большая беда - неправильное понимание требований заказчика.

    Теперь организуем правильное увольнение сотрудников с помощью кадрового приказа.

    · Создайте в Конфигураторе новый документ "Увольнение".

    · Укажите, что он содержит реквизиты шапки "Сотрудник" тип "Справочник.Сотрудники и "Дата увольнения" тип Дата.

    · Создайте для него удобную форму для ввода данных.

    Простейший кадровый учет


  • Напишите следующий текст в модуле документа в процедуре ОбработкаПроведения():

    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    СпрСотр.НайтиЭлемент(Сотрудник);

    СпрСотр.ДатаУвольнения = ДатаУвольнения;

    СпрСотр.Записать();


  • Первая строка создает ссылку на справочник Сотрудники. Вторая строка ищет в справочнике того сотрудника, который будет уволен. Следующая строка устанавливает ему дату увольнения. И последняя строка записывает сделанные изменения в справочнике.

    Создадим журнал "КадровыеДокументы". Для этого установите курсор на "Журналы документов" в дереве конфигурации и щелкните Новый. Задайте имя журнала. Здесь больше ничего не трубуется.

    Простейший кадровый учет


    Теперь откройте окно для редактирования структуры документа "ПриемНаРаботу". В верхней части окна измените журнал "Прочие" на журнал "КадровыеДокументы"

    То же самое проделайте для документа Увольнение.

    Сохраните конфигурацию на всякий случай.

    Теперь создадим пользовательское меню. В окне конфигурации внизу есть вкладка Интерфейсы.

    Простейший кадровый учет


    Для каждой категории пользователей программы может быть заведен свой собственный интерфейс. Интерфейс включает пункты меню и кнопки на панели инструментов. Например, кадровику необязательно залезать в зарплату сотрудников.



    Создайте новый Интерфейс и назовите его Администратор. Интерфейс появится в списке интерфейсов.

    Щелкните дважды на интерфейсе и выберите "Редактировать меню". Откроется окно редактора меню.

    Простейший кадровый учет


    У него есть замечательная кнопка
    Простейший кадровый учет
    , которая автоматически создает все пункты меню. Сделаем исключение и воспользуемся помощью конструктора меню, потому что нам нужно создать обычное меню для доступа ко всем объектам без всяких заморочек. Если нужно сделать что-нибудь более интересное, например, добавить разделители, перегруппировать пункты меню, то это нужно будет делать вручную.

  • Нажмите кнопку
    Простейший кадровый учет
    и затем "Построить". Конструктур автоматически создаст все пункты меню.


  • Простейший кадровый учет


  • Меню можно сразу протестировать, как оно будет выглядеть для пользователя. Для этого нажмите кнопку "Пуск", появится тестовое окно. Посмотрите на меню и закройте тестовое окно.


  • Кстати, вы можете попробовать научиться редактировать пункты меню. Смелее экспериментируйте. Например, перетащите пункт меню Кадровые документы в пункт Документы, а пункт Журналы документов удалите. Отделите журнал от документов разделителем. Мне кажется, так будет удобнее.


  • Простейший кадровый учет


  • Закройте редактор меню.


  • Сохраните конфигурацию и запустите ее. Проверьте работу документа Увольнение и пощелкайте меню.

    На этом создание простейшей системы для кадрового учета завершено. Она позволяет принимать и увольнять сотрудников. Конечно, все очень неудобно. Уволенные хранятся вместе с работающими в одном списке. Реквизитов для хранения информации очень мало, нет печатных форм документов, нет кнопочек на панели инструментов, нет кадрового перемещения - куча пробелов в нашей системе. Но это же только простейшая кадровая система и она уже работает!

    Для сравнения скажу, что написание такой же системы на другом языке программирования Visual Basic или Delphi займет в два-три раза больше времени и сил. Что бы там ни говорили недоброжелатели, но на 1С программы пишутся в несколько раз быстрее.












    Простой перебор операций и проводок


    Пример, выбрать все операции за период:
    Опер = СоздатьОбъект("Операция");

    Опер.ВыбратьОперации(НачДата, КонДата); //заданный период
    Пока Опер.ПолучитьОперацию()=1 Цикл
    Сообщить(Опер.СуммаОперации);

    Сообщить(Опер.Содержание);
    //организуем перебор проводок текущей операции

    //1-й вариант

    Опер.ВыбратьПроводки();

    Пока Опер.ПолучитьПроводку()=1 Цикл
    Сообщить(Опер.Дебет.Счет);

    Сообщить(Опер.Кредит.Счет);

    Сообщить(Опер.Сумма);
    КонецЦикла;

    //2-й вариант перебора проводок текущей операции

    Для Ном = 1 По Опер.КоличествоПроводок() Цикл
    Опер.ПолучитьПроводкуПоНомеру(Ном); //проводка стала текущей

    Сообщить(Опер.Дебет.Счет);

    Сообщить(Опер.Кредит.Счет);

    Сообщить(Опер.Сумма);
    КонецЦикла;
    КонецЦикла;




    Простой перебор


    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    Режим = 0; //выбирать без учета иерархии, 1 - с учетом (по умолч.)

    СпрСотр.ВыбратьЭлементы(Режим);

    Пока СпрСотр.ПолучитьЭлемент()=1 Цикл

    .....<действия с очередным элементом/группой>

    КонецЦикла;




    Проведение документа


    Оператор Провести() в приведенном выше примере выполнит проведение документа. При проведении будет вызвана предопределенная процедура ОбработкаПроведения(). Вторым реквизитом передается в обработку проведения значение ("Программно"), по которому процедура ОбработкаПроведения() узнает о программном выполнении проведения. Это может быть простая строка или число, её задача - только обозначить факт программного проведения.
    Если вы работаете с уже существующим документом, то метод Провести() перепроведет документ. А с помощью метода Проведен() можно узнать, проведен ли какой-либо документ:
    Если Док.Проведен() > 0 Тогда
    Сообщить( "Документ № " + Док.НомерДок + " проведен");

    …………… // Какие-то действия, которые нужно сделать с проведенным документом
    КонецЕсли;
    О создании операций и проводок при проведении документов читай раздел Операции и проводки главы Бухгалтерия.
    Транзакции
    При создании множества документов или для ускорения работы можно заключить цикл в транзакцию. При этом реальная запись документов произойдет только по команде ЗафиксироватьТранзакцию(). На время транзакции блокируется для других пользователей запись и проведение документов.
    СписаниеМатериалов = СоздатьОбъект("Документ.ТребованиеНакладаная");

    НачатьТранзакцию();

    Для Ном = 1 По 100 Цикл
    СписаниеМатериалов.Новый();

    …………………

    // Заполнение реквизитов

    СписаниеМатериалов.Записать();

    СписаниеМатериалов.Провести();
    КонецЦикла;

    ЗафиксироватьТранзакцию();
    Напомню, что предопределенная процедура ОбработкаПроведения() самостоятельно открывает транзакцию для проведения, однако есть маленькая особенность документа, созданного функцией СоздатьОбъект(). Дело в том, что про программном проведении созданных документов не выполняется автоматическая предварительная запись, и для того, чтобы при любых сбоях и ошибках сохранялась согласованность данных документа и его движений (операций) следует объединять запись и проведение документа в одну транзакцию.
    Установка периодического реквизита справочника при проведении документа
    Простым примером такого действия является установка нового оклада сотруднику в справочнике Сотрудники при проведении, например, штатного расписания.
    Процедура ОбработкаПроведения()
    УстановитьРеквизитСправочника (Сотрудник, "Оклад", НовыйОклад, ДатаДок);
    КонецПроцедуры
    Здесь Сотрудник - значение реквизита документа типа "Справочник", через него в справочнике позиционируется нужный элемент, а "Оклад" - периодический реквизит соответствующего элемента. Этот оператор можно использовать только в предопределенной процедуре ОбработкаПроведения(). Теперь при просмотре истории периодического реквизита вы увидите кроме самого значения, ещё и дату установки (соответствует дате документа), и документ, который установил данное значение.




    Проведение документа


    Некоторые документы могут проводиться. С точки зрения пользователя, "провести" документ означает "пустить его в дело". С точки зрения программиста, при проведении документа сработает модуль проведения
    документа (процедура ОбработкаПроведения). Именно там определяются все действия, выполняемые при проведении документа. Например, при проведении документа "Приказ о приеме на работу" сработает модуль этого документа, который в справочник Сотрудники добавит нового сотрудника.




    Проведение документов


    При проведении документа часто требуется установить новое значение периодического реквизита на определенную дату. Это называется движение документа. В этом случае следует применять метод УстановитьРеквизитСправочника:
    Процедура ОбработкаПроведения()
    УстановитьРеквизитСправочника(Сотрудник, "Должность", НоваяДолжность, ДатаПеремещения);
    КонецПроцедуры
    Если документ имеет табличную часть и вы хотите, чтобы движения документа были привязаны к номеру строки документа, тогда следует применять метод ПривязыватьСтроку.
    Процедура ОбработкаПроведения()
    ВыбратьСтроки();

    Пока ПолучитьСтроку()=1 Цикл
    ПривязыватьСтроку(НомерСтроки);

    УстановитьРеквизитСправочника(Сотрудник, "Должность", НоваяДолжность, ДатаПеремещения);
    КонецЦикла;
    КонецПроцедуры




    после сборки, поступают на склад.


    Болт М16 ГОСТ 7798-70

    1

    Гайка М16 ГОСТ 5929-70

    2

    Шайба М16 ГОСТ 11371-78

    1

    2.14 Справочник Склады.

    Изделия, после сборки, поступают на склад. Складов может быть либо один, либо несколько. В этом же справочнике будут указаны и отдельные места хранения для комплектующих. Справочник складов кроме кода и названия склада больше ничего содержать не будет.

    Идентификатор: Склады

    Подчинен: нет

    Количество уровней: 1

    Код: 5 Тип кода: число Серии кодов: подчинение

    Наименование: 25

    Основное представление: наименование

    Группы сверху: да

    Автонумерация: да Уникальность: да

    Одна форма для элемента и группы?: нет

    Редактировать: в списке

    "Код" – порядковый номер.

    "Наименование" – Название склада.

    Реквизит

    Описание

    ТипЗначения

    Доп.

    Исп.

    Изм.

    Создаем справочник:

  • Создаем форму списка, самую простую;


  • Заполняем:





  • Путевой лист


    Данный документ является заданием для курьера, который доставляет товары покупателю. Экранная форма документа выглядит следующим образом:
    Путевой лист

    Сначала пользователь указывает район, при этом автоматически заполняется табличная часть - формируется путевой лист. Программа просматривает все текущие заказы по данному району, дата доставки которых совпадает с датой путевого листа или просрочена. Пользователь может подредактировать доставляемое количество в колонке "Доставить" в связи с отсутствием товара на складе или тяжести груза для одного курьера.
    После этого путевой лист распечатывается и проводится. Печатная форма путевого листа выглядит следующим образом:
    Путевой лист

    При проведении документа совершаются движения в регистрах Остатки и Доставка:
    Процедура ОбработкаПроведения()
    ВыбратьСтроки();

    Пока ПолучитьСтроку()=1 Цикл
    //доставляемые товары

    Регистр.Доставка.Товар = Товар;

    Регистр.Доставка.Клиент = Клиент;

    Регистр.Доставка.Заказ = Заказ;

    Регистр.Доставка.Цена = Цена;

    Регистр.Доставка.ДатаДоставки = ДатаДоставки;

    Регистр.Доставка.Количество = Количество;

    Регистр.Доставка.Сумма = Сумма;

    Регистр.Доставка.ДвижениеПриходВыполнить();

    //уменьшаются остатки по данному товару

    Регистр.Остатки.Товар = Товар;

    Регистр.Остатки.Количество = Количество;

    Регистр.Остатки.ДвижениеРасходВыполнить();
    КонецЦикла;
    КонецПроцедуры




    Работа с индексами


    Для организации упорядочивания содержимого файла БД и поиска в ней по значению одного или нескольких полей применяется механизм индексов. Его применение можно сравнить с сортировкой картотеки по определенному признаку (совокупности признаков). Однако, в отличие от картотеки, файл БД может иметь сразу несколько индексов, и, соответственно, являться упорядоченным одновременно по нескольким признакам. Индексы хранятся в индексном файле. Индексный файл может содержать информацию более чем об одном индексе. Рекомендуется для одного файла DBF иметь один индексный файл, в котором хранятся все индексы для этого файла.
    Каждый индекс имеет наименование, признак уникальности, выражение индекса и фильтр. Наименование индекса используется для идентификации индекса. Выражение индекса и фильтр представляют собой написанные на специальном языке выражения, вычисление значения которых для каждой записи позволяет определить ее место при упорядочивании и необходимость помещения ее в упорядоченный список (индекс может содержать упоминание не обо всех записях таблицы, а только об удовлетворяющих выражению фильтра). Уникальный индекс (имеющий установленным признак уникальности) позволяет иметь в индексе ссылки на записи только с различным значением индексного выражения.
    Основное правило: индекс нужен, чтобы быстро искать нужную запись.








    Работа с программой


    Порядок работы с программой:

    1. Товар поступает на склад по документам ПриходнаяНакладная (см. описание документа ПН)

    При внесении ПН можно проконтролировать и исправит розничную цену.

    2. Отпуск товара по точкам выполняется только через ДокументРеализатора (см. описание документа ДР)

    Направление движения товара задается СтатусомДокумента.

    3. По документам ПКО вносится выручка торговых точек.

    4. Периодически выполняется инвентаризация реализатора.

    Для этого нужно распечатать остатки реализатора. (Меню\Отчеты\Остатки реализатора)

    Отдать на торговую точку для заполнения.

    Затем следует создать документ ИнвентаризацияРеализатора,

    заполнить его согласно ведомости инвентаризации.

    При этом конфигурация рассчитывает количество проданного товара,

    так чтобы остатки реализатора совпадали с документом ИнвентаризацияРеализатора.

    В отчете ВзаиморасчетыРеализатора можно увидеть баланс торговой точки.

    (к-во проданного товара, сумма выручки, сумма недостачи, остаток товара)
    Кадровый учет




    Работа с сериями диаграммы


    //установим количество серий. Каждая при этом получит свой номер.

    Диаграмма1.КоличествоСерий(3); // так у нас будет три серии

    //однако если в другом методе будет передана серия с большим номером,

    //количество серий будет автоматически увеличено.
    КолСерий = Диаграмма1.КоличествоСерий();

    // а так переменной КолСерий будет передано текущее количество серий
    // так мы зададим имя "Рубли" серии № 1

    Диаграмма1.УстановитьИмяСерии(1, "Рубли");
    // установим цвет серии № 2

    // этот метод не обязательный, как впрочем и некоторые другие

    Диаграмма1.ЦветСерии(2, 35, 67, 90);

    // установили: 35 единиц красной компоненты, 67 - зеленой, 90 - синей
    //можно установить имена серий автоматически: Серия1, Серия2, и т.д.

    Диаграмма1.АвтоУстановкаИменСерий(1);

    //если поставить вместо флага 1 флаг 0, автоустановка имен будет запрещена.




    Работа с точками диаграммы


    //установим количество точек, скажем, 8 штук

    Диаграмма1.КоличествоТочек(8);

    //однако если в другом методе будет передана тока с большим номером,

    //количество точек будет автоматически увеличено.
    // метод может возвратить текущее количество точек

    КолТочек = Диаграмма1.КоличествоТочек();
    // можно установить имя любой точки

    Диаграмма1.УстановитьИмяТочки(7, "7 точка");
    //можно установить имена точек автоматически: 1, 2, 3, и т.д.

    Диаграмма1. АвтоУстановкаИменТочек(1);

    //если поставить вместо флага 1 флаг 0, автоустановка имен будет запрещена.




    Работа с удаленными записями


    Файлы DBF устроены таким образом, что удаление записи не приводит к физическому удалению записи из файла. Запись просто помечается на удаление и пропускается при переборе. Таким образом размер файла остается прежним. Чтобы физически удалить все помеченные на удаление записи нужно применить метод Сжать. Средства встроенного языка позволяют работать с такими записями, перебирать их и даже отменять пометку на удаление.
    Файл.ПоказыватьУдаленные(1);

    Файл.Первая();

    Пока Файл.ВКонце()=0 Цикл

    ......Если Файл.ЗаписьУдалена()=1 Тогда

    ............Файл.Восстановить();

    ......КонецЕсли;

    ......Файл.Следующая();

    КонецЦикла;

    Файл.Первая();

    Пока Файл.ВКонце()=0 Цикл

    ......Если Файл.PRICE < 1000 Тогда

    ............Файл.Удалить();

    ......КонецЕсли;

    ......Файл.Следующая();

    КонецЦикла;
    Файл.Сжать(); //удалить записи физически

    Можно удалить все записи в файле одним движением. При этом они физически удаляются и не могут быть восстановлены.

    Файл.ОчиститьВсе();

    Стоит еще отметить про метод Очистить(), что он очищает все поля текущей записи. Атрибуты, соответствующие полям типа "строковый" приобретают значение «пустая строка», числовой — 0, логический — 0, дата — «пустая дата».




    Работа со структурой файла DBF


    Например, создадим файл, идентичный по структуре исходному.

    //При этом применяется метод ОписаниеПоля, который возвращает характеристики поля с указанным номером

    //синтаксис: ОписаниеПоля(<НомерПоля>,<НазваниеПоля>,<Тип>,<Длина>,<Точность>)
    Файл1 = СоздатьОбъект("XBASE");

    Файл2 = СоздатьОбъект("XBASE");

    Файл1 = ОткрытьФайл("file1.dbf");

    Для н = 1 По Файл1.КоличествоПолей() Цикл

    ........НазвПоля = "";

    ........Тип = "";

    ........Длина = 0;

    ........Точность = 0;

    ........Файл1.ОписаниеПоля(н,назвПоля,Тип,Длина,Точность);

    ........Файл2.ДобавитьПоле(назвПоля,Тип,Длина,Точность);

    КонецЦикла;
    Для работы с файлом DBF неизвестной структуры часто применяются следующие методы:

    ПолучитьЗначениеПоля(<ИмяПоля>);

    УстановитьЗначениеПоля(<ИмяПоля>,<значение>);




    Расчет зарплаты


    Все промежуточные и окончательные результаты расчета зарплаты хранятся в журнале расчетов Зарплата. В журнале Зарплата можно включить закладки отбора сотрудников по категориям, по подразделениям или по группам справочника Сотрудники (Работающие и Уволенные).
  • Для инициализации расчета сначала необходимо провести документ "Начало месяца", который введет в журнал Зарплата нерассчитанные записи с нулевым результатом (за исключением стандартных вычетов, которые сразу рассчитываются).

  • Затем необходимо ввести периоды невыходов (прогулов) документом "Ввод невыходов". Этот документ вводит вид расчета "Невыход", который вытесняет виды расчета ПоОкладу и ПоТарифу.

  • Если некоторым сотрудникам полагаются премии, то нужно провести документ "Ввод премий".

  • После этого можно произвести расчет зарплаты обработкой "Расчет зарплаты". Существует два режима расчета зарплаты: только начисления и окончательный расчет. При окончательном расчете рассчитываются все виды расчетов, включая подоходный налог и сумму "на руки".

  • После окончательного расчета можно сформировать отчеты по зарплате.

  • Для закрытия месяца следует сменить период расчета в журнале Зарплата. Все записи станут архивными и их уже нельзя будет корректировать. Если все-таки это потребуется, то для корректировки результатов расчета предыдущих месяцев следует вводить новые записи-сторно, у которых период действия распространяется на прошлые месяцы. Т.е. запись введена, например, в феврале, а период действия у нее - январь.





  • Расходная накладная




    90.2 (Продажи.Себестоимость продаж)


    40 (Выпуск продукции (работ, услуг))




    90.3 (Продажи.Налог на добавленную стоимость)


    68.1 (Расчеты по налогам и сборам.НДС)




    90.9 (Продажи.Прибыль/убыток от продаж)


    99 (Прибыли и убытки)




    90.1 (Продажи.Выручка)


    90.2 (Продажи.Себестоимость продаж)




    90.1 (Продажи.Выручка)


    90.3 (Продажи.Налог на добавленную стоимость)




    90.1 (Продажи.Выручка)


    90.9 (Продажи.Прибыль/убыток от продаж)




    62 (Расчеты с покупателями и заказчиками)


    90.1 (Продажи.Выручка)









    Расходный ордер




    60 (Расчеты с поставщиками и подрядчиками)


    50.1 (Касса.Касса организации)









    Различия




    Константы


    хранят значения, сохраняются в базе данных


    Документ хранит не одно значение, а событие хозяйственной деятельности предприятия, кроме того событие порождает изменение состояния данных. Документ обязательно имеет дату и время, может содержать табличную часть, хранит множество данных различных типов, которые могут быть связаны с данными других объектов. Константы не имеют печатной формы.




    Справочники


    сохраняется в базе данных, имеет реквизиты, справочники могут быть подчиненными друг другу Могут иметь печатные формы


    Справочник хранит нормативно-справочную информацию, а документы отражают события реального мира. Обычно значения реквизитов документов выбираются из справочников. Документ обычно проводится, имеет дату и время. Справочники, в отличие от документов могут быть многоуровневыми, иметь периодические (привязанные к дате) реквизиты.




    Перечисления


    хранится в БД, хранит список значений


    Перечисление может хранить только список значений, который задается разработчиком в режиме Конфигуратор. Не имеют печатной формы. Не редактируются пользователем.




    Таблица значений


    имеет строки и колонки (не хранится в БД)


    ТаблицаЗначений предназначена для временного хранения промежуточных данных в памяти компьютера, возникающих во время работы программы, и удаляется, когда работа с ней закончена. Документ записывает все данные в БД. Таблицы значений не могут быть подчиненными друг другу. Не имеют печатной формы.




    Список значений


    хранит список значений (не сохраняется в БД)


    Представляет собой временный набор данных, так же как и таблица значений. Не имеют печатной формы.




    Отчеты


    Имеет печатные формы


    Отчет обычно считывает данные, хранящиеся в БД и формируются печатные формы для вывода данных в нужном виде на экран или на принтер.






    Различия




    Константы


    хранит значение, сохраняется в базе данных


    Справочник хранит не одно значение, а целый список однородных объектов.




    Документы


    сохраняется в базе данных, имеет реквизиты, документы могут быть подчиненными друг другу


    Справочник хранит нормативно-справочную информацию, а документы отражают события реального мира. Обычно значения реквизитов документов выбираются из справочников. Документ обычно проводится, документ обязательно имеет дату и время, документ может содержать табличную часть, чего нет в справочниках (в версии 8.0 справочники и документы могут иметь по несколько табличных частей). Справочники могут быть многоуровневыми, в справочнике могут быть периодические реквизиты, чего нет в документах (в версии 8.0 периодических реквизитов нет, а есть периодические регистры сведений).




    Перечисления


    хранится в БД, хранит список значений


    Множество значений в справочник вводит пользователь в режиме Предприятие, а для перечислений список значений задается разработчиком в режиме Конфигуратор. Перечисления обычно используются в операторах Если.




    ТаблицаЗначений


    имеет строки и колонки (не хранится в БД)


    ТаблицаЗначений предназначена для хранения промежуточных данных в памяти компьютера, возникающих во время работы программы. Таблица значений может хранить разнородные объекты, а в справочнике все элементы одного типа. Таблицы значений не могут быть многоуровневыми или подчиненными друг другу.




    СписокЗначений


    хранит список значений (не сохраняется в БД)


    Список значений может хранить разнородные объекты, а в справочнике все элементы одного типа






    Развернутое сальдо по субконто


    Функции СНДРС, СНКРС, СКДРС, СККРС предназначены для расчета остатков по счетам, у которых ведется аналитический учет по субконто. Каждая функция из этой группы возвращает остаток как сумму соответствующих остатков (дебетовых или кредитовых) по всем объектам аналитического учета.
    Если аналитический учет по счету ведется по двум и более субконто, то для развернутого сальдо параметр <ТипФильтра> устанавливает участие данног вида субконто в получении развернутого сальдо. В зависимости от значения этого параметра данное субконто может участвовать в «развороте» остатка, или накладывать дополнительное ограничение (отбирать) на анализируемые остатки, или никак не влиять на результат функции.








    Развернутое сальдо по субсчетам


    Функции СНДР, СНКР, СКДР, СККР предназначены для расчета остатков по счетам, у которых учет ведется на субсчетах. Каждая функция из этой группы возвращает остаток как сумму соответствующих остатков (дебетовых или кредитовых) всех субсчетов указанного счета. При этом учитываются остатки по субсчетам являющихся собственно счетами, а не группами.








    Редактор форм


    У многих объектов конфигурации есть экранные формы. В частности экранные формы в версии 7.7 имеют справочники, документы, журналы документов, отчеты, обработки, журналы расчетов, журнал операций, журнал проводок, план счетов и счет. У некоторых объектов может быть несколько экранных форм, например, у справочников есть формы списков, форма элемента и форма группы.
    Редактор форм

    Поясним значение кнопок панели редактора форм:






















    Редактор форм


    Эти кнопки становятся доступными, когда выделено несколько элементов управления на форме. Они позволяют выравнивать их по левому, по правому, по верхнему и по нижнему краю.

    Редактор форм


    Эти кнопки центрируют выделенные элементы управления относительно всей формы по вертикали или горизонтали .

    Редактор форм


    Эти кнопки равномерно распределяют выделенные элементы управления по вертикали или горизонтали.

    Редактор форм


    Эти кнопки делают выделенные элементы управления одной ширины, одной высоты или одного размера. Определяющим является элемент управления, выделенный последним. Два элемента управления можно выделить, удерживая кнопку Shift и щелкая поочередно на каждом из них.

    Редактор форм


    Включить/выключить решетку.

    Запустить тестовое окно (проверить форму в режиме конфигуратора).

    Вызвать окно редактирования слоев формы (попробуйте обязательно - это очень важно!).

    Разберем кнопки на панели элементов управления:
    Редактор форм























































    Редактор форм


    Эта кнопка вызывает что-то типа мастера элементов диалога. Можно быстро разместить любой элемент управления, назначить ему тип, присвоить вызов процедуры и т.д.

    Редактор форм


    Эта кнопка размещает на форме обычную кнопку. В свойствах кнопки в поле Формула пишется имя процедуры, которая будет запущена при нажатии на кнопку.

    Редактор форм


    Эта кнопка размещает на форме флажок. В свойствах флажка в поле формула пишется имя процедуры, которая будет запущена при установке или снятии флажка.

    Редактор форм


    Эта кнопка размещает на поле переключатель. Переключатели имеют смысл, когда их несколько, в этом случае пользователь производит выбор между несколькими вариантами. Чтобы переключатели заработали, нужно сделать следующее: для первого переключателя установить в свойствах флажок "Первый в группе". Далее проверить, чтобы порядок обхода элементов был точно в том порядке, в котором следуют переключатели (Действия => Настройка порядка обхода). Типичный камешек для новичков.

    Редактор форм


    Эта кнопка размещает на форме список значений. При этом по имени списка можно обращаться к нему из модуля (объект СписокЗначений). Можно добавлять значения в список, удалять значения и делать все другие операции, возможные для объекта СписокЗначений.

    Редактор форм


    Эта кнопка размещает на форме поле со списком значений. При этом также создается объект СписокЗначений. Обратите внимание что лучше задать БОЛЬШУЮ ВЫСОТУ этого элемента управления, чтобы список раскрывался. Типичный камешек для новичков.

    Редактор форм


    Обычная рамка. Можно визуально объединить несколько элементов управления. Служит для удобства пользователя.

    Редактор форм


    Текстовое поле. Если в поле Формула вписать имя функции, то при каждом обновлении формы 1С будет вызывать вашу функцию и ее результат будет отображаться в этом поле. Кстати, если щелкнуть на эту кнопку и затем щелкнуть на табличной части справочника, документа или журнала, тогда мы создадим текстовую колонку. Она не будет сохраняться в базе данных, но у нее есть поле Формула, куда можно написать любое выражение. Очень полезная вещь для всяких информационных колонок. Типичная непонятность для новичков.

    Редактор форм


    Поле для ввода данных. Для поля можно назначить любой тип данных, допустимый в 1С:Предприятие. В поле Формула можно написать имя процедуры, которая будет вызываться при изменении значения данного поля. ВНИМАНИЕ: для размещения на форме реквизитов справочников и документов пользуйтесь кнопкой:
    Редактор форм
    . Типичный камешек для новичков.

    Редактор форм


    Эта кнопка размещает на форме таблицу значений. По имени таблицы значений к ней можно обращаться из модуля. Колонки и строки таблицы создаются программным способом (см. объект ТаблицаЗначений).

    Редактор форм


    Для иерархических справочников на форме списка можно разместить дерево групп.

    Редактор форм


    Эта кнопка размещает на форме картинку. Управление картинкой осуществляется программным способом (см. объект Картинка).

    Редактор форм


    Эта кнопка размещает на форме поля для ввода данных, связанные с реквизитами справочников и документов. Только в этом случае, введенные данные будут сохраняться в базе данных.

    Для удобства пользователей обязательно настройте последовательный порядок обхода элементов диалога! При интенсивном вводе информации желательно максимальное использование клавиатуры. Порядок обхода настраивается следующим образом. В меню Диалог снимаете флажок "Автоматический порядок обхода". Затем опять в меню Диалог щелкаете "Порядок обхода" и последовательно щелкаете на номерах элементах диалога в том порядке, в котором они должны быть. Порядок обхода можно также редактировать в меню Диалог => "Настройка порядка обхода".




    Редактор печатных форм (макетов)


    У отчетов есть печатные формы, это понятно. У документов также есть печатные формы, это тоже понятно. Но печатные формы могут быть и у других объектов: справочников, журналов документов, плана счетов и т.д. Фактически у любого объекта, у которого есть экранная форма, может быть одна или несколько печатных форм.
    Печатные формы состоят из ячеек, в которых содержатся текст или формулы, что очень напоминает Microsoft Excel. Печатные формы формируются на встроенном языке 1С при помощи вывода секций. В печатной форме может не быть секций вообще, тогда можно вывести или все, или ничего. Но в большинстве случаев нужно выводить какую-то повторяющуюся часть много раз, например список сотрудников, список товаров и т.д. Секции могут горизонтальными и вертикальными.
    Редактор печатных форм (макетов)

    Поясним значения кнопок панели редактора печатных форм:






















    Редактор печатных форм (макетов)


    Рисование линий, прямоугольников, размещение на печатной форме текстовых надписей, картинок, диаграмм. Редко используемые кнопки на самом деле.

    Редактор печатных форм (макетов)


    Кнопка перехода в режим выбора рисунков.

    Редактор печатных форм (макетов)


    Кнопка объединения нескольких ячеек в одну.

    Редактор печатных форм (макетов)


    Кнопки создания/уничтожения вертикальных и горизонтальных секций. Если выделить несколько строк, а затем щелкнуть на первую кнопку, то мы создадим горизонтальную секцию. Если выделить столбцы и щелкнуть на первую кнопку, то создадим вертикальную секцию. Для каждой секции нужно задать имя, по которому мы сможем обратиться к ней из модуля.

    Редактор печатных форм (макетов)


    Остальные кнопки попробуйте сами:
    Список секций таблицы.

    Включение / выключение сетки.

    Включение / выключение заголовков столбцов и строк.

    Включение / выключение границ секций.

    Включение / выключение режима "Только просмотр".

    Фиксация строк или столбцов. При прокрутке таблицы эти строки / столбцы будут оставаться на экране.

    У каждой ячейки есть свойства, которые вызываются правой кнопкой мыши:
    Редактор печатных форм (макетов)

    Предлагаю вам изучить его методом научного тыка, по справке или по книжке "Администрирование и конфигурирование". Обратите внимание на поле Расшифровка, поскольку это очень важно и часто используется при программировании на 1С.




    Редактор программных модулей


    У каждой экранной формы есть программный модуль. Кроме того, есть программные модули документов и глобальный модуль. В этих модулях располагается программа на встроенном языке 1С, который похож на Бейсик, но имеет свои особенности.
    Редактор программных модулей

    В программном модуле имеется синтаксическая подсветка. Разными цветами отображаются ключевые слова, переменные, комментарии и значения. Цветовая палитра настраивается в параметрах.
    Поясним значения кнопок панели редактора программных модулей:






















    Редактор программных модулей


    По тексту программы можно расставить закладки или пометки (marks), и перемещаться по ним. Полезная вещь для больших модулей в сотни и тысячи строк.

    Редактор программных модулей


    Кнопки сдвига блока текста вправо и влево. Становятся активными, когда выделено одна или несколько строчек.

    Редактор программных модулей


    Закомментировать / раскомментировать блок текста.

    Редактор программных модулей


    Кнопка автоформатирования текста программы. Нажимайте ее чаще и ваши программы будут красивыми! К сожалению, это не избавит их от всех ошибок, но их определенно станет меньше!

    Редактор программных модулей


    Открыть модуль в отладчике.

    Проверить модуль на синтаксические ошибки.

    Перейти к определенной строке модуля.

    Открыть окно со списком процедур и функций модуля. (полезная вещь!)

    При редактировании модуля также обратите свое внимание на верхние кнопочки. Там вы найдете кнопки поиска, вызова синтакс помощника и другие интересности, например, конструктуры. Чаще пользуйтесь синтакс-помощником - очень полезная вещь! Помните, что там можно искать слова! Более того, при редактировании модуля можно щелкнуть правой кнопкой на любом слове и выбрать там пункт "Найти в Синтакс-помощнике".




    Регистр: Остатки товаров Измерения: Товар, Склад Ресурсы: Кол-во, Стоимость


    С помощью методов встроенного языка мы можем легко получить ответы на вопросы:
  • остаток конкретного товара на конкретном складе

  • остаток конкретного товара на всех складах

  • стоимость всех товаров на конкретном складе





  • Регистры, используемые в примерах:




    Оборотный регистр Доходы

    Измерения: Клиент, Товар

    Ресурсы: Доход

    Реквизиты: нет

    Периодичность: День


    Регистр остатков Товары

    Измерения: Товар, Склад

    Ресурсы: Количество, Стоимость

    Реквизиты: нет




    Хранит доходы от продаж за день в разрезе клиентов и товаров.


    Хранит остатки товаров на каждом складе в количественном и суммовом выражении.






    Реквизиты документа


    Каждый вид документа может иметь неограниченное количество реквизитов в шапке и в многострочной части. Для документа создается форма ввода — экранный диалог. При настройке для документа задаются также общие характеристики: длина номера документа, условия поддержки уникальности номеров и другие. Все документы характеризуются номером, датой и временем.
    Термин "шапка" — достаточно условный и может относиться не только к реквизитам документа, которые физически находятся в верхней части бумажного бланка документа. Поэтому, в наиболее общем случае, реквизитом заголовочной части будет считаться любой реквизит, который встречается в документе только один раз. Табличная часть документа представляет собой список однотипных строк с информацией. Например, в уже упоминавшемся счете на оплату табличная часть — это перечень товаров или услуг, подлежащих оплате. Помимо наименований, табличная часть документа может содержать также разнообразную дополнительную информацию — стоимость товаров или услуг, количество, объем, вес и многое другое. В большинстве случаев табличная часть используется для формирования общей суммы документа. Структура документа в системе 1С:Предприятие 7.7 может содержать только одну табличную часть.
    При разработке документов в Конфигураторе может быть создано необходимое количество общих реквизитов документов. Такие реквизиты, будучи созданными один раз, становятся доступными для всех документов: общие реквизиты можно размещать в формах документов, к значениям общих реквизитов можно обращаться из встроенного языка системы 1С:Предприятие. Работая с системой 1С:Предприятие, пользователь может выполнять отбор документов в журналах по значениям общих реквизитов документов




    Ресурсы




    Остатки (регистр остатков)


    Товар


    Количество




    Заказы (регистр остатков)


    Товар

    Клиент

    Заказ

    Цена

    ДатаДоставки


    Количество

    Сумма




    Доставка (регистр остатков)

    (хранит доставляемые в данный момент товары)


    Товар

    Клиент

    Заказ

    Цена

    ДатаДоставки


    Количество

    Сумма




    Доходы (оборотный регистр)


    Товар

    Клиент


    Доход




    Отчеты


  • Товары

  • Сводная таблица







  • Родитель


    Перебор элементов внутри группы. Группа в терминах 1С -- это "родитель".








    Счет и план счетов


    Счет в 1С:Предприятие соответствует обычному бухгалтерскому счету. Совокупность счетов образует план счетов. На предприятии может применяться одновременно несколько планов счетов. Счет имеет код и наименование. Длина и структура кода счета задается при конфигурировании, например, ##.## Счета, заданные в режиме Конфигуратора нельзя редактировать в режиме пользователя.
    Субсчет
    У счета могут быть субсчета. Например, счет 10 "Материалы" может иметь субсчет 10.3 "Топливо". В системе 1С:Предприятие возможно ведение субсчетов с более сложной структурой: у субсчета может, в свою очередь, быть свой "субсубсчет" и так далее.
    Тип счета: активный / пассивный / активно-пассивный
    Для активного счета сумма по дебету увеличивает сальдо по счету (дебетовое сальдо). Для пассивного счета сумма по дебету уменьшает сальдо по счету (кредитовое сальдо). Для активно-пассивного счета сальдо может быть свернутым или развернутым. Развернутое сальдо означает наличие остатка по дебету и кредиту счета одновременно.
    Аналитический учет (субконто и вид субконто).
    Для получения информации о наличии и движении средств предприятия не только по счетам, но и в более детальных разрезах, предназначено ведение аналитического учета.
    Субконто. Для обозначения объектов аналитического учета в 1С:Предприятии используется термин субконто. Наличие субконто позволяет более детально раскрыть информацию о средствах предприятия, накапливаемых на счетах бухгалтерского учета. В этом субконто похожи на субсчета - они позволяют получать более мелкую градацию итогов внутри одного счета по определенному признаку. Кроме того, субконто позволяет отследить движение средств по одному объекту аналитического учета по всем счетам, на которых ведется аналитический учет в данном разрезе. Например, движение конкретного основного средства.
    Вид субконто. Под видом субконто понимается совокупность однотипных объектов аналитического учета. Для одного счета может быть задано ведение аналитического учета по нескольким видам субконто. Так, например, для счета 10 может быть определено ведение аналитического учета по двум видам субконто: "Материалы" и "Склады". Это является примером многомерного учета в 1С:Предприятие. Итоги можно получать как по материалам в разрезе складов, так и по складам в разрезе материалов, а также, разумеется, в целом по всем материалам и по всем складам.



    Количественный учет

    Для количественного счета в 1С:Предприятие накапливается итоговая информация в количественном (натуральном) выражении. Возможность ведения количественного учета обычно используется в совокупности с аналитическим учетом. В этом случае можно получать более полную отчетную информацию по объектам аналитического учета, например, наличие товаров на складе.

    Валютный учет

    Система 1С:Предприятие позволяет вести валютный учет по нескольким валютам. Все используемые валюты задаются в справочнике валют. Для всех валютных счетов итоговая информация накапливается на счете для каждой валюты отдельно, а также по счету в целом. По каждой валюте итоговая информация по счету накапливается как в валютном выражении, так и в ее эквиваленте базовой валюты. Если в справочнике валют имеется курс, то при вводе проводок будет автоматически вычисляться сумма проводки по валютной сумме и текущему курсу.

    Забалансовые счета

    В некоторых случаях на предприятиях требуется использование вспомогательных счетов, которые не должны попадать в баланс. Для забалансовых счетов не действует правило двойной записи.

    Разделитель учета

    Система 1С:Предприятие позволяет вести бухгалтерский учет нескольких предприятий в одной информационной базе. Для этого используется разделитель учета. Под разделителем учета понимается некоторое значение, например "Фирма", которое заносится в каждую проводку и позволяет получать все бухгалтерские итоги по каждому такому значению отдельно. Это позволяет, фактически, получить несколько независимых балансов.




    Счета и субсчета


    Счета могут объединяться в группы. Счет, который является группой, называется "синтетический счет". Счет, который входит в группу, называется "субсчет". Для работы с такими счетами применяются следующие методы:








    Секции


    Фирма 1С предоставила мощный инструмент формирования отчетов -- Секции. Секция -- это область таблицы, предназначенная для многократного вывода. Например, в отчете по сотрудникам будет секция "Сотрудник", которую нужно будет выводить для каждого сотрудника. Секции могут быть горизонтальными или вертикальными. Можно также выводить пересечения горизонтальных и вертикальных секций.




    Шаблоны


    Шаблоны предназначены для облегчения нелегкого труда программиста. Чтобы не писать длинные конструкции, а заменять их короткими словами. При этом при вводе такого сокращения оно автоматически заменяется на полную конструкцию.
    Например, вам надоело постоянно писать "КонецЕсли;". Предлагаю придумать сокращение "ке". При вводе такого сокращения оно автоматически заменится на "КонецЕсли;" (даже с точкой запятой в конце!).
    Можно сделать и более сложные вещи. Вы вводите слово "Пока". Понятно, что это начало цикла. При этом 1С запросит условие в диалоговом окне и далее сформирует всю конструкцию и даже поставит курсор, куда нужно, чтобы можно было продолжать писать программу.
    Пока <ваше условие> Цикл

    КонецЦикла;
    Окно для редактирования шаблонов вызывается из Синтакс-помощника правой кнопкой или через Сервис => Настройка шаблонов.




    Шапка




    Реквизит


    Описание


    ТипЗначения







    Шапка




    Реквизит


    Описание


    ТипЗначения







    Шапка




    Реквизит


    Описание


    ТипЗначения







    Шапка




    Реквизит


    Описание


    ТипЗначения







    Шапка




    Реквизит


    Описание


    ТипЗначения







    Шапка




    Реквизит


    Описание


    ТипЗначения







    Шапка




    Реквизит


    Описание


    ТипЗначения







    Шапка




    Реквизит


    Описание


    ТипЗначения







    Шапка




    Реквизит


    Описание


    ТипЗначения







    Слои и закладки на форме


    Форма может состоять из нескольких слоев. Каждый слой может быть показан или скрыт в любой комбинации с другими слоями.
    Синтаксис: Форма.ИспользоватьСлой(<ИмяСлоя>,[<Режим>])
    //показать слой Основной

    Форма.ИспользоватьСлой("Основной",1);
    //скрыть слой Основной

    Форма.ИспользоватьСлой("Основной",0);

    //показать слой Основной и скрыть все остальные

    Форма.ИспользоватьСлой("Основной",2);

    //показать слой Основной и Фон и скрыть все остальные

    Форма.ИспользоватьСлой("Основной,Фон",2);
    //закладки на форме реализуются с помощью слоев

    Форма.ИспользоватьЗакладки(1);

    Форма.Закладки.ДобавитьЗначение(1, "Закладка 1");

    Форма.Закладки.ДобавитьЗначение(2, "Закладка 2");
    Процедура ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки)

    ....Если НомерЗакладки = 1 Тогда

    ......Форма.ИспользоватьСлой("Фон,Шаг1");

    ...Иначе

    ......Форма.ИспользоватьСлой("Фон,Шаг2");

    ...КонецЕсли;

    КонецПроцедуры




    Снятие заказа


    Документ предназначен для отмены ранее сделанных заказов. Можно уменьшить количество заказанного ранее товара. Экранная форма документа выглядит следующим образом:
    Снятие заказа

    Пользователь указывает клиента, при этом автоматически заполняется табличная часть документа текущими заказами по данному клиенту. Пользователь указывает нужное количество товара в колонке "Снять".
    При проведении документа производятся движения в регистре Заказы:
    Процедура ОбработкаПроведения()
    ВыбратьСтроки();

    Пока ПолучитьСтроку()=1 Цикл
    Если Количество > 0 Тогда
    Регистр.Заказы.Товар = Товар;

    Регистр.Заказы.Клиент = Клиент;

    Регистр.Заказы.ДатаДоставки = ДатаДоставки;

    Регистр.Заказы.Заказ = Заказ;

    Регистр.Заказы.Цена = Цена;

    Регистр.Заказы.Количество = Количество;

    Регистр.Заказы.Сумма = Сумма;

    Регистр.Заказы.ДвижениеРасходВыполнить();
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры




    Сортировка списка значений


    //сортировать по значению

    СписокЗнач.Сортировать(); //по возрастанию

    СписокЗнач.Сортировать(1); //по убыванию

    //сортировать по представлению

    СписокЗнач.СортироватьПоПредставлению(); //по возрастанию

    СписокЗнач.СортироватьПоПредставлению(1); //по убыванию




    Сортировка таблицы значений


    //сортировать по должности по возрастанию

    ТабЗнач.Сортировать("Должность+");
    //сортировать по должности по возрастанию, а внутри должности по убыванию оклада

    ТабЗнач.Сортировать("Должность+,Оклад-");




    Сортировка


    В форме списка справочника элементы могут быть отсортированы в различном порядке: по коду, по наименованию или по любому реквизиту, у которого в Конфигураторе установлен флажок Сортировка. Задать тип сортировки можно программно методом Сортировка (Способ, ФлагРазрешенияИзменения)








    Состав документа


    С точки зрения программиста, у документа есть экранная форма -- Диалог. Именно его видит пользователь на экране. Также у документа обычно есть одна или несколько бумажных форм -- Таблиц. С помощью Таблиц документ печатается на бумаге. Поведение документа определяется с помощью встроенного языка1С. На языке записывается, что документ делает в системе, как он формирует бумажный бланк и как он себя ведет на экране.
    Документ обычно имеет печатную форму. Печатная форма полностью формируется средствами встроенного языка 1С, что придает большую гибкость программе. Это одна из причин ошеломляющего успеха системы 1С:Предприятие. Печатная форма документа - это фактически отчет, формируемый обычно из формы открытого документа и содержащий сведения из этого документа. Чтобы научиться формировать печатные формы, вам нужно изучить главу Отчеты (объект "Таблица").
    У документа может быть несколько шаблонов печатных форм. Средствами встроенного языка (метод ИсходнаяТаблица) задается тот шаблон печатной формы, который будет использоваться.
    Шаблоны печатных форм (таблицы) могут быть общие. Это дает возможность использовать один шаблон для печати нескольких видов документов. Т.е. общая таблица является глобальной для конфигурации и может быть использована в любом модуле. Примером из типовой конфигурации может являться шаблон печатной формы "Отчет о движении документа", который используется разными модулями конфигурации




    Состав отчета


    У любого отчета в системе 1С есть экранная форма -- Диалог, который пользователь видит на экране. В диалоге пользователь обычно задает параметры формирования отчета, например, период времени. Также у отчета обычно есть одна или несколько бумажных форм -- Таблиц. С помощью таблиц отчет печатается на бумаге. Алгоритм формирования отчета записывается в модуле отчета на встроенном языке 1С. Например, для кадрового отчета "Сотрудники, принятые за период" нужна экранная форма с двумя полями Содержание
    и Окончание. Оба поля будут иметь тип "дата". Модуль отчета должен выбрать из справочника Сотрудники нужных людей и вывести их в таблицу.




    Создание диаграммы


    Диаграмма вставляется в таблицу печатной формы с помощью пункта Вставить рисунок меню Таблица. Далее необходимо сделать следующие действия: определить тип диаграммы (гистограмма, график, круговая и т.п.), настроить внешний вид составных частей диаграммы, а затем описать процедуру "наполнения" данными при выводе печатной формы. Пройдемся поподробнее по каждому из этих действий.
    Задание типа диаграммы
    Для отображения разных наборов данных имеются более или менее удачные типы диаграмм. Задача программиста при конфигурировании определить тип будущей диаграммы, и задать его при форматировании области построения (контекстное меню области - закладка Тип диаграммы). Задав тип и закрыв окно форматирования, можно увидеть пример построенной диаграммы.
    Настройка внешнего вида диаграммы
    Для того чтобы включить режим форматирования областей диаграммы, необходимо выбрать пункт Изменить подменю Объект: 1С. V7. Диаграмма меню Действия (тое же пункт есть в контекстном меню диаграммы). Каждая из составных частей диаграммы в режиме редактирования имеет пункт контекстного меню Формат области … Настройка внешнего вида состоит из выбора заливки, рамки, цвета и шрифта текста и т.п. Там же можно определить, например, сетку для области построения. После завершения форматирования достаточно щелкнуть по любой ячейке таблицы, чтобы выключить режим форматирования.




    Создание и проведение документа


    Новый документ в системе 1С можно ввести различными методами:

    Интерактивно - этот способ можно реализовать по-разному.
    1. Вариант первый. Пользователь выбирает Пункт меню Документы и в подменю щелкает по названию необходимого документа. Что происходит дальше. Документу присваивается номер, устанавливаются дата, начинается обработка операторов предопределеннной процедуры модуля формы документа ВводНового(), после чего открывается экранная форма с вызовом процедуры ПриОткрытии(). Новый документ создается в памяти, а для того, чтобы он был записан в базу, необходимо нажать кнопку Записать.
    2. Разновидностью этого варианта является создание документа из открытой формы журнала документов. Второй вариант предполагает создание нового документа путем копирования такого же. При копировании документу присваивается новый номер, а все реквизиты заполняются данными из скопированного документа. Вот почему, если в процедуре ВводНового() вы заполняете некоторые реквизиты при создании нового документа, то необходимо в начале этой процедуры задать проверку факта копирования, для того, чтобы не сбить значения реквизитов.
    3. При третьем варианте новый документ создается на основании существующего документа другого вида. В такой ситуации вместо процедуры ВводНового() будет вызвана процедура ВводНаОсновании(). В ней нужно описать, какие реквизиты нового документа будут заполнены значениями из документа-основания. Естественно, что заполняемые реквизиты нового документа должны иметь тот же тип, что и соответствующие реквизиты-источники. Пример заполнения расходной накладной на основании счета:
    Процедура ВводНаОсновании(ДокОсн)
    РасчетныйСчет = ДокОсн.РасчетныйСчет;

    МестоХранения = глЗначениеПоУмолчанию("ОсновнойСклад");

    Контрагент = ДокОсн.Контрагент;

    Договор = ДокОсн.Договор;

    ВариантРасчетаНалогов = ДокОсн.ВариантРасчетаНалогов;
    ДокОсн.ВыбратьСтроки();

    Пока ДокОсн.ПолучитьСтроку() = 1 Цикл
    НоваяСтрока();

    Товар = ДокОсн.Товар;

    Количество = ДокОсн.Количество;

    Цена = ДокОсн.Цена;




    Сумма = ДокОсн.Сумма;

    НДС = ДокОсн.НДС;

    Всего = ДокОсн.Всего;

    КонецЦикла;

    КонецПроцедуры

    При вызове процедуры происходит установка значений некоторых полей и флажков накладной значениями из счета. Сначала мы заполнили реквизиты шапки, а затем организовали цикл считывания строк табличной части счета операторами ВыбратьСтроки() и ПолучитьСтроку(). В этом же цикле на каждую строку основания вводится и заполняется новая строка накладной (команда НоваяСтрока()).

    Доступ к реквизитам счета осуществляется через переменную ДокОсн, которая является параметром процедуры. Как мы помним (см. описание предопределенных процедур модуля формы документа), в неё передается контекст документа-основания.

    4. Программный способ - для него в языке 1С предусмотрены специальные команды. Можно при записи расходной накладной сформировать документ СчетФактура:

    СФ = СоздатьОбъект("Документ.СчетФактура");

    СФ.Новый();

    СФ.ВариантОтправки = 1;

    СФ.НомерДок = НомерДок; // Счет-фактура будет с тем же номером и датой, что и

    СФ.ДатаДок = ДатаДок; // накладная. Но так можно и не делать, есть же автонумерация

    СФ.Контрагент=Контрагент;

    СФ.Грузополучатель=Контрагент;

    ВыбратьСтроки();

    Пока ПолучитьСтроку()=1 Цикл

    СФ.НоваяСтрока();

    // Реквизит "Товар" док-та СчетФактура имеет неопределенный тип

    СФ.НазначитьТип("Товар", "Справочник.Номенклатура");

    СФ.Товар=Товар;

    Если ПустоеЗначение(Товар.СтранаПроисхождения) = 0 Тогда

    // а это обращение к реквизитам справочника "Номенклатура"

    СФ.СтранаПроисхождения = Товар.СтранаПроисхождения;

    Иначе

    СФ.СтранаПроисхождения = "Россия";

    КонецЕсли;

    СФ.Количество=Количество;

    СФ.Цена=Цена;

    СФ.Сумма=Сумма;

    СФ.НДС=НДС;

    СФ.Всего=Сумма+НДС;

    // Здесь накладная становится основанием счета-фактуры через специальный реквизит

    СФ.ДокументОснование = ТекущийДокумент();

    КонецЦикла;

    СФ.Записать();

    СФ.Провести(0, "Программно");

    Обратите внимание, что сначала создается документ как объект, а затем вводится новый документ. Последующие действия похожи на действия при вводе на основании. Не забудьте, если вы создаете или изменяете документ программно, его необходимо записывать. И пожалуйста, не пытайтесь использовать метод Провести() в теле предопределенной процедуры ОбработкаПроведения() модуля документа!




    Создание объекта СписокЗначений


    Список значений - это аналог одномерного массива в 1С, который предназначен для хранения и обработки промежуточных данных, возникающих в процессе работы программы. Объект "Список значений" имеет множество полезных возможностей и работает очень быстро. Следует учитывать, что в языке 1С есть и одномерные массивы в том смысле, как это принято в других языках программирования (Перем мас[10]). Список значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.
    СписокЗнач = СоздатьОбъект("СписокЗначений");




    Создание операции и проводок


    При проведении документа, имеющего отношение к бухгалтерскому учету, процедура проведения должна заполнить атрибуты операции данного документа и сформировать проводки.
    Процедура ОбработкаПроведения()
    //заполнение атрибутов операции

    Операция.СуммаОперации = Итог("Сумма");

    Операция.Содержание = "Поступление материалов";

    Операция.Журнал = "МТ"; //доп. реквизит операции
    //для каждой строки документа сделаем проводку

    ВыбратьСтроки();

    Пока ПолучитьСтроку()=1 Цикл
    ПривязыватьСтроку(1); //проводки будут содержать номер строки документа

    //создание проводки и заполнение атрибутов проводки

    Операция.НоваяПроводка();

    Операция.Дебет.Счет = СчетПоКоду("10.1");

    Операция.Дебет.Склады = Склад; //1-й вариант обращения к субконто

    Операция.Дебет.Субконто(ВидыСубконто.Материалы,Материал); //2-й вариант

    Операция.Количество = Количество;

    Операция.Кредит.Счет = СчетПоКоду("51");

    Операция.Кредит.Субконто(1,РасчетныйСчет); //3-й вариант

    Операция.Сумма = Сумма;

    //у нас счет 10.1 валютный, поэтому

    Операция.ВалСумма = Сумма*Курс;

    Операция.Валюта = Валюта;

    Операция.Филиал = Филиал; //разделитель учета (доп. реквизит проводки)
    КонецЦикла;

    Операция.Записать();
    КонецПроцедуры
    Итак, у операции есть следующие атрибуты:








    Создание, сохранение и проведение документа


    ДокПрием.Новый();

    ДокПрием.ФИО = "Иванов Иван Иванович";

    ДокПрием.Оклад = 5000;

    ДокПрием.Записать();
    //программное проведение документа

    ДокПрием.Провести();




    Создание таблицы значений


    Таблица значений - это двумерный массив в 1С, который предназначен для хранения и обработки промежуточных данных, возникающих в процессе работы программы. Таблица значений часто применяется при программировании на 1С, потому что имеет множество полезных возможностей и работает очень быстро. Таблица значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.
    ТабЗнач = СоздатьОбъект("ТаблицаЗначений");
    ТабЗнач.НоваяКолонка("Номер");

    ТабЗнач.НоваяКолонка("Сотрудник");

    ТабЗнач.НоваяКолонка("Должность");

    ТабЗнач.НоваяКолонка("Оклад");
    //можно указать тип данных каждой колонки

    //если тип данных колонки не указан, то можно хранить данные любого типа

    Синтаксис: НоваяКолонка(<Идентификатор>, <Тип>, <Длина>, <Точность>, <Заголовок>, <Ширина>, <Формат>, <Положение>)

    ТабЗнач.НоваяКолонка("Номер","Число",10,0);

    ТабЗнач.НоваяКолонка("Сотрудник","Справочник.Сотрудники");

    ТабЗнач.НоваяКолонка("Должность","Справочник.Должности");

    ТабЗнач.НоваяКолонка("Оклад","Число",10,2);




    Создание, удаление и корректировка счетов


    Обычно счета создаются вручную в режиме Конфигуратор или Предприятие. Но иногда может потребоваться программная корректировка списка счетов.
    Счета = СоздатьОбъект("Счет.Основной");
    Счета.Новый(1); //у счета будут субсчета

    Счета.Код = "10";

    Счета.Наименование = "Материалы";

    Счета.Активный = 1; //активный

    Счета.Записать();
    Счета.Новый();

    Счета.Код = "10.1";

    Счета.Наименование = "Основные материалы";

    Счета.ВидСубконто(1,ВидыСубконто.Материалы);

    Счета.ВидСубконто(2,ВидыСубконто.Склады);

    Счета.Записать();
    Пример, изменить наименование счета:
    Счета = СоздатьОбъект("Счет.Основной");

    Счета.НайтиПоКоду("10");

    Счета.Наименование = "Все материалы";

    Счета.Записать();
    Пример, пометить на удаление все счета, введенные пользователем в режиме "Предприятие". Оставить только счета, заданные разработчиком в Конфигураторе.
    Счета = СоздатьОбъект("Счет.Основной");

    Счета.ВыбратьСчета();

    Пока Счета.ПолучитьСчет()=1 Цикл

    .....Если Счета.ЗаданВКонфигурации()=0 Тогда

    .........Счета.Удалить(0); //пометить на удаление

    .....КонецЕсли;

    КонецЦикла;
    Пример, отменить все пометки на удаление:
    Счета = СоздатьОбъект("Счет.Основной");

    Счета.ВыбратьСчета();

    Пока Счета.ПолучитьСчет()=1 Цикл

    .....Если Счета.ПометкаУдаления()=1 Тогда

    .........Счета.СнятьПометкуУдаления();

    .....КонецЕсли;

    КонецЦикла;




    Список значений как элемент диалога


    Список значений может использоваться в экранных формах как элемент диалога с пользователем.
    Список значений как элемент диалога

    //установить курсор на указанную строку или можно узнать, где находится курсор.

    ТекСтрока = СписокЗнач.ТекущаяСтрока(НовСтрока);
    //список значений в диалоге может иметь пометки (флажки)
    пометка = СписокЗнач.Пометка(Позиция); //прочитать пометку у значения списка

    СписокЗнач.Пометка(Позиция,1); //установить пометку у значения списка

    СписокЗнач.Пометка(Позиция,0); //снять пометку у значения списка




    Справочник "Черный список"


    Данный справочник будет хранить список недругов каждого пользователя, от которых он не желает получать письма. При открытии справочника отражается список недругов текущего пользователя, работающего с программой.
    Справочник имеет единственное дополнительное поле Недруг, значения которого выбирается из спр.Пользователи
    Справочник





    Справочник "Книги" (форма списка)


    Экранная форма списка справочника Книги выглядит следующим образом:
    Справочник





    Справочник Контрагенты




  • Работающие

  • Иванов Иванов Иванов

  • Петров Петр Петрович

  • Уволенные

  • Светлов Михаил Петрович

  • Цветков Антон Васильевич





  • Партнеры

  • Партнер 1

  • Партнер 2

  • Поставщики

  • Поставщик 1

  • Поставщик 2







  • Справочник "Кошельки"


    Данный справочник будет содержать названия мест хранения денежных средств семьи.
    Справочник





    Справочник "Пользователи"


    Данный справочник будет содержать сведения о пользователях конфигурации. Фактически - это будет список почтовых ящиков. При входе в систему производится поиск логина в этом справочнике и если он не находится, то в справочник автоматически добавляется новый пользователь. Глобальная переменная ТекПользователь при начале работы системы получает значение из этого справочника, т.е. по этой переменной в любом модуле программы всегда можно узнать, какой пользователь работает с конфигурацией.
    Данный справочник содержит следующие поля:
  • Код

  • Наименование (краткое имя, логин)

  • ПолноеИмя

  • Подпись (для подстановки в новые письма)

  • ЕстьПисьмо (флажок, который показывает, что пришла новая почта)

  • Справочник





    Справочник "Произведения" (форма элемента)


    Экранная форма элемента справочника Произведения выглядит следующим образом:
    Справочник





    Справочник "Работодатели"


    Данный справочник будет содержать сведения о фирмах и индвидуальных предпринимателях, которые предлагают свои вакансии. При нажатии на кнопку Вакансии показывается список вакансий данного работодателя.
    Справочник





    Справочник "Резюме"


    Данный справочник будет содержать резюме соискателей. У каждого соискателя может быть несколько резюме. При нажатии на кнопку "Поиск подходящих вакансий" программа просматривает список вакансий и выбирает из них те, которые подходят для данного резюме.
    Справочник





    Справочник "Соискатели"


    Данный справочник будет хранить сведения о соискателях, которые предлагают свои резюме. При нажатии на кнопку Вакансии показывается список резюме данного соискателя. У каждого соискателя может быть несколько резюме. Например, соискатель знает 1С и знает Photoshop, но указывать их в одном резюме - признак плохого тона. Себя надо позиционировать очень четко, потому что работодателей раздражают люди, которые знают все.
    Справочник





    Справочник "Статьи доходов"


    Данный справочник будет содержать названия источников дохода семейных средств.
    Справочник





    Справочник "Статьи расходов"


    Данный справочник будет содержать названия направлений расходования семейных средств. Это многоуровневый справочник.
    Справочник





    Справочник "Участники"


    Данный справочник будет содержать имена членов семьи и названия сторон, от имени которых производятся доходы и расходы, и кому принадлежат кошельки.
    Справочник





    Справочник "Вакансии"


    Данный справочник будет содержать сведения о вакансиях работодателей. У каждого работодателя может быть несколько различных вакансий. Некоторые поля можно не заполнять, например График работы, Образование, Пол. Это означает, что работодателя не интересует данная характеристика. При нажатии на кнопку "Поиск подходящих резюме" программа просматривает список резюме и выбирает из них те, которые подходят для данной вакансии.
    Справочник





    Справочники


    Обслуживаемая магазиномом территория делится на районы. При регистрации клиента указывается его название / ФИО, адрес, телефон и район, в котором он находится. В справочнике Курьеры перечислены фамилии курьеров или названия мобильных отрядов, осуществляющих доставку товаров покупателю. Справочник товары является иерархическим и содержит 3 уровня, т.е. товары могут быть объединены в группы. Для товара указывается цена, по которой он продается клиентам.




    Ссылка на документ


    Для работы с документом из какого-нибудь модуля требуется сначала создать ссылку на этот документ.
    ДокПрием = СоздатьОбъект("Документ.ПриемНаРаботу");

    ДокУвольн = СоздатьОбъект("Документ.ПриказОбУвольнении");




    Ссылка на календарь


    1-й вариант:
    Календ = СоздатьОбъект("Календарь.Служащие");
    2-й вариант:
    Календ = Календари.Служащие;




    Ссылка на объект Таблица


    Для работы с таблицей требуется сначала создать ссылку на объект Таблица. Если таблица не одна, то следует указать нужную таблицу.
    Таб = СоздатьОбъект("Таблица");

    или

    Таб = СоздатьОбъект("Таблица");

    Таб.ИсходнаяТаблица("НужныйОтчет");
    <вывод секций таблицы>
    Таб.Показать(); //показать таблицу на экране




    Ссылка на справочник


    Для работы со справочником из какого-нибудь модуля требуется сначала создать ссылку на этот справочник.








    Ссылка на вид расчета


    1-й вариант:
    ВР = ВидРасчета.НаРуки;

    ВР = ВидРасчета.Премия;
    2-й вариант:
    ВР = ВидРасчета.ПолучитьАтрибут("НаРуки");
    Пример, определим сумму "по окладу" текущего сотрудника:
    ПоОкладу = 0;

    ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");

    ДатаНач = '01.01.2002';

    ЖЗ. ВыбратьПериодПоОбъекту(ТекСотр, ДатаНач);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    ....Если ЖЗ.ВидРасч = ВидРасчета.ПоОкладу Тогда

    .........ПоОкладу = ПоОкладу + ЖЗ.Результат;

    ....КонецЕсли;

    КонецЦикла;




    Ссылка на журнал расчетов


    ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");




    Статический фильтр (только версия 7.7)


    В 1С 7.7 нельзя установить отбор по периодическому реквизиту или по нескольким реквизитам одновременно (сложный фильтр). В этом случае выходом из положения может быть метод ИспользоватьСписокЭлементов. Этому методу нужно передать список элементов, которые должны быть показаны. Предварительно этот список нужно сформировать.








    СтатусВозврата


    Если в предопределенной процедуре вызвать команду СтатусВозврата(0), то действие не будет выполнено, например, документ не будет записан или форма не откроется. Следует помнить, что после вызова СтатусВозврата(0), предопределенная процедура продолжает свое выполнение. Чтобы выйти из процедуры, используйте команду Возврат.




    Сведения о сотрудниках


    Ниже приведена экранная форма списка справочника "Сотрудники".
    Сведения о сотрудниках

    Справочник Сотрудники двухуровневый и содержит две группы Работающие и Уволенные. В верхней части формы отображается информация по текущему сотруднику (на котором установлен курсор). Кнопка Мастер сотрудников вызывает отчет "Мастер сотрудников", который представляет собой фактически конструктор отчетов.
    Ниже приведена экранная форма элемента справочника "Сотрудники".
    Сведения о сотрудниках

    Кнопка "Еще..." вызывает форму элемента справочника "Кадровые данные".
    Сведения о сотрудниках





    Таблица




    Реквизит


    Описание


    ТипЗначения







    Таблица




    Реквизит


    Описание


    ТипЗначения







    Таблица




    Реквизит


    Описание


    ТипЗначения







    Таблица




    Реквизит


    Описание


    ТипЗначения







    Таблица




    Реквизит


    Описание


    ТипЗначения







    Таблица




    Реквизит


    Описание


    ТипЗначения







    Таблица




    Реквизит


    Описание


    ТипЗначения







    Таблица




    Реквизит


    Описание


    ТипЗначения







    Таблица значений как элемент диалога


    Таблица значений может использоваться в экранных формах как элемент диалога с пользователем.
    //установить курсор на указанную колонку или можно узнать, где находится курсор

    ТабЗнач.ТекущаяКолонка(НоваяКолонка,ТекКолонка);

    //установить курсор на указанную строку или можно узнать, где находится курсор.

    ТекСтрока = ТабЗнач.ТекущаяСтрока(НовСтрока);

    ТабЗнач.ВидимостьКолонки("Оклад",0); //скрыть колонку Оклад

    ТабЗнач.ВидимостьКолонки("Должность, Сотрудник",1); //показать колонки Должность и Сотрудник

    ТабЗнач.ВидимостьКолонки("Оклад",1,1); //показать колонку Оклад в 1-й позиции

    //можно зафиксировать верхние строки и левые колонки для удобства прокрутки таблицы значений в диалоге

    ТабЗнач.Фиксировать(КолСтрок,КолКолонок);




    Таблица




    Реквизит


    Описание


    ТипЗначения







    Табличная часть документа


    Перебор строк, добавление и удаление строк табличной части документа..
    //перебор строк табличной части

    Док.ВыбратьСтроки();

    Пока Док.ПолучитьСтроку()=1 Цикл

                ...

    КонецЦикла;
    //добавление строки

    Док.НоваяСтрока();

    Док.РеквизитТаблЧасти = Значение;
    //удаление строки

    Док.УдалитьСтроку();




    Табличные части (только версия 8.0)


    В версии 8.0 появилась возможность для элемента справочника иметь несколько табличных частей. Эту возможность рекомендуется использовать для отражения информации, связанной с данным элементом, но не имеющей собственной объектной сущности (для которых рекомендуется завести подчиненный справочник). Например, для спр. Товары может быть заведена табличная часть ЕдиницыИзмерения, для справочника Сотрудники могут быть заведены табличные части Образование и СоставСемьи. Работа с табличными частями похожа на работу с подчиненными справочниками за исключением того, что табличные части не могут быть типами, а значит уже будет нельзя создать реквизит типа Образование.




    Технические подробности


    Игровое поле реализовано в виде множества кнопок на трех слоях формы. Текущая игровая ситуация хранится в массиве Поле[100]. Число 0 означает куст, 1 - скрытую лису, 2- пойманную лису, 3 - число. В процедуре ОбновитьПоле выводится игровое поле на форме в соответствии с этим массивом.
    Кнопка Игра, вызывает процедуру Игра(), которая начинает новую игру: расставляет на поле лис с помощью функции СлучайноеЧисло(). Кстати, очень полезная функция, но 1С ее почему-то не реализовала. Наверное, думала, что в бухгалтерии "ничто не случайно".
    При нажатии на кнопку с лисой вызывается процедура ЛисаПоле(), при нажатии на кнопку с кустом или скрытой лисой вызывается процедура КустПоле. Если на поле скрытой лисы не было, то отображается число лис же горизонтали, вертикали и диагоналях клетки. Это число подсчитывается процедурой КоличествоЗапеленгованныхЛис().
    Если количество пойманных лис (переменная ПЛ) равняется количеству всех лис (переменная ВЛ), то игра заканчивается. Если ходов было сделано меньше, чем в рекорде, то победителю придлагается увековечить свое достижение (процедура Увековечить).




    Технические подробности


    Игровое поле реализовано в виде множества кнопок (64х3). На каждом поле размещается по три кнопки: пустая, с белой фишкой и с черной фишкой. В процедуре ПоказатьДоску в соответствии с массивом Доска скрываются и показываются нужные кнопки. В массиве Доска хранится текущая игровая ситуация. Значение поля = 1 означает пустую клетку, 2 и 3 - белые и черные фишки.
    При нажатии на кнопку игрового поля происходит вызов процедуры ХодЮзера. В этой процедуре определяется правильность хода (функция ВозможенХод) и вызывается процедура ВыполнитьХод, которая меняет цвет окруженных фишек. Затем проверяется, есть ли у компьютера возможные ходы и если есть, тогда происходит самое "интеллектуальное": процедура НашХод подбирает самый лучший ход в данной игровой ситуации. В этой процедура в памяти создается копия доски (процедура ДублироватьДоску) и на ней происходит перебор всех возможных ходов с выбором наилучшего с помощью оценочной функции РейтингХода.




    Типы данных


    Для каждого атрибута справочника нужно указать его тип данных, например, "число", "строка", "дата" (в версии 8.0 есть еще тип Булево - Истина или Ложь). Это базовые типы, но можно указать и сложные типы данных. Например атрибут Должность имеет тип данных Должности. В этом случае, значения этого атрибута будут выбираться из справочника Должности. Так реализуется простейшая связь между справочниками, когда значения атрибутов одного справочника выбираются из другого справочника.







    Справочник Сотрудники

    Справочник Должности









    Транзакции


    При удалении множества элементов справочника для ускорения работы можно заключить цикл в транзакцию. При этом реальное удаление (пометка на удаление) всех элементов произойдет только по команде ЗафиксироватьТранзакцию(). На время транзакции справочник блокируется.
    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    НачатьТранзакцию();
    СпрСотр.ВыбратьЭлементы();

    Пока СпрСотр.ПолучитьЭлемент()=1 Цикл

    ......СпрСотр.Удалить(0); //пометка на удаление

    КонецЦикла;
    ЗафиксироватьТранзакцию();




    Транзакции


    При создании множества элементов справочника для ускорения работы можно заключить цикл в транзакцию. При этом реальное создание всех элементов произойдет только по команде ЗафиксироватьТранзакцию(). На время выполнения транзакции справочник блокируется.








    Учет НДС




    68.1 (Расчеты по налогам и сборам.НДС)


    19.3 (Налог на добавленную стоимость.Налог на добавленную стоимость по приобретенным материально-производственным запасам)









    Удаление документа


    ДокПрием.Удалить(0); //пометка на удаление

    ДокПрием.Удалить(1); //непосредственное удаление

    //можно проверить, помечен ли документ на удаление

    //функция возвращает 1 - если помечен, 0 - если нет

    Пометка = ДокПрием.ПометкаУдаления();




    Удаление операций и проводок


    При отмене проведения документа автоматически удаляются операции и проводки, которые он сформировал (если у него стоит параметр Создавать операцию "только при проведении").
    Опер = СоздатьОбъект("Операция");

    Если Опер.НайтиОперацию(ВыбрДокумент)=1 Тогда

    ....Опер.Удалить(1); //непосредственное удаление (по умолч.)

    ....Опер.Удалить(0); //пометка операции (документа) на удаление

    КонецЕсли;
    Методы ПометкаУдаления и СнятьПометкуУдаления работают так же, как для документов.
    Метод УдалитьПроводку удаляет текущую проводку из операции.
    Иногда проводки лучше не удалять, а просто выключить. Тогда они исключаются из бухгалтерских итогов. Потом проводки можно обратно включить.

    Опер.ВключитьПроводки(0); //выключить проводки

    Опер.ВключитьПроводки(1); //включить проводки




    Удаление строк и колонок из таблицы значений


    ТабЗнач.Очистить(); //очистить таблицу значений и удалить колонки
    ТабЗнач.УдалитьСтроки(); //удаляет все строки (колонки сохраняются)
    ТабЗнач.УдалитьСтроку(); //удаляет текущую строку

    ТабЗнач.УдалитьСтроку(3); //удаляет 3-ю строку

    ТабЗнач.УдалитьКолонку("Оклад"); //удаляет колонку Оклад

    ТабЗнач.УдалитьКолонку(2); //удаляет 2-ю колонку

    ВНИМАНИЕ

    Часто требуется удалить строки, удовлетворяющие определенному условию.

    Так как при удалении строки из таблицы значений следующая строка становится текущей,

    то указанная ниже программа может удалить НЕ ВСЕ необходимые строки.
    //ЭТА ПРОГРАММА НЕПРАВИЛЬНАЯ !!!

    ТабЗнач.ВыбратьСтроки();

    Пока ТабЗнач.ПолучитьСтроку()=1 Цикл

    ...Если <условие> Тогда

    ......ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей,

    ...КонецЕсли;

    КонецЦикла;
    В этом случае я рекомендую использовать следующий прием:

    ТабЗнач.ВыбратьСтроки();

    Пока ТабЗнач.ПолучитьСтроку()=1 Цикл

    ~начало:

    ...Если <условие> Тогда

    ......ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей

    ......Если ТабЗнач.НомерСтроки<>0 Тогда

    ........ Перейти ~начало;

    ......КонецЕсли;

    ...КонецЕсли;

    КонецЦикла;
    А вот еще один правильный алгоритм, предложенный Wlad:
    ТабЗнач.выбратьстроки();

    Пока ТабЗнач.ПолучитьСтроку()=1 Цикл

    .......Пока (<условие>) и (ТабЗнач.НомерСтроки<>0) Цикл

    ..............ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей

    .......КонецЦикла;

    КонецЦикла;




    Удаление записей в журнале расчетов


    При отмене проведения документа обычно автоматически удаляются всего его движения, в том числе и введенные записи в журналы расчетов.
    Можно также явно удалять записи методом журнала расчетов УдалитьЗапись().




    Удаление значений из списка


    СписокЗнач.УдалитьВсе(); //очистить список значений
    //удаляет значения из указанной позиции

    СписокЗнач.УдалитьЗначение(откуда, [сколько]);




    Условие отбора


    Часто требуется ограничить выборку только нужными значениями. Например, этот запрос выбирает всех сотрудников с определенной должностью.
    Запрос = СоздатьОбъект("Запрос");

    ТекстЗапроса = "

    |Сотр = Справочник.Сотрудники.ТекущийЭлемент;

    |КодДолж = Справочник.Сотрудники.Должность.Код;

    |Группировка Сотр упорядочить по Сотр.Наименование;

    |Условие (КодДолж = 7);

    |";

    Запрос.Выполнить(ТекстЗапроса);
    Пока Запрос.Группировка("Долж")=1 Цикл

    ............Сообщить(Запрос.Сотр);

    КонецЦикла;




    Установка даты выборки периодических реквизитов


    //можно установить дату выборки периодических реквизитов для всего справочника

    СпрСотр.ИспользоватьДату(НекаяДата);
    //тогда ниже уже нельзя использовать методы Установить и Получить

    //доступ к периодическим реквизитам становится такой же, как к обычным реквизитам

    Катег = СпрСотр.Категория;

    СпрСотр.Оклад = 6000;




    Установка и получение значений из подбора


    КонтФормыПодбора.УстановитьЗначениеВПодборе(<ИмяРеквизита>,<Значение>)
    <ИмяРеквизита> - строка с именем реквизита формы подбора значения;

    <Значение> - значение реквизита.
    КонтФормыПодбора.ПолучитьЗначениеИзПодбора(<Выражение>)
    <Выражение> - строковое выражение, значение которого вычисляется в контексте формы подбора и возвращается в качестве результата.




    Установка текущего владельца


    СпрДоговоры = СоздатьОбъект("Справочник.Договоры");

    СпрДоговоры.ИспользоватьВладельца(ВыбрКонтрагент);

    СпрДоговоры.ВыбратьЭлементы(); //открываем выборку по договорам выбранного контрагента

    <...>




    Установка текущей группы


    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    СпрСотр.ИспользоватьРодителя(грпРаботающие); //теперь мы внутри группы Работающие

    СпрСотр.ВыбратьЭлементы(); //открыть выборку элементов группы Работающие

    СпрСотр = СоздатьОбъект("Справочник.Сотрудники");

    СпрСотр.ИспользоватьРодителя(грпРаботающие);

    СпрСотр.Новый(); //создание нового элемента в группе Работающие




    Ведомость




    70 (Расчеты с персоналом по оплате труда)


    50.1 (Касса.Касса организации)


    Таким образом мы получили следующие синтетические счета:

    10.2 - Материалы.Покупные полуфабрикаты и комплектующие изделия, конструкции и детали;

    19.3 - Налог на добавленную стоимость.Налог на добавленную стоимость по приобретенным материально-производственным запасам;

    20 - Основное производство;

    40 - Выпуск продукции (работ, услуг);

    50.1 - Касса.Касса организации;

    60 - Расчеты с поставщиками и подрядчиками;

    62 - Расчеты с покупателями и заказчиками;

    68.1 - Расчеты по налогам и сборам.НДС;

    70 - Расчеты с персоналом по оплате труда;

    90.1 - Продажи.Выручка;

    90.2 - Продажи.Себестоимость продаж;

    90.3 - Продажи.Налог на добавленную стоимость;

    90.9 - Продажи.Прибыль/убыток от продаж;

    99 - Прибыли и убытки;

    Итого одиннадцать счетов, ряд которых имеет субсчета.
    2.17 Определение перечня субконто.
    Определимся теперь с аналитическим учетом. Распишем разрезы аналитики по нашим счетам (в соответствии с вышеупомянутым постановлением):
  • Счет 10 (Материалы). Нам надо знать, куда поступили комплектующие, что конкретно поступило, по какому документу (чтобы потом списывать из партий, пришедших первыми);

  • Счет 19 (Налог на добавленную стоимость). Аналитики нет;

  • Счет 20 (Основное производство). На что тратим деньги, господа!? – это первый разрез аналитики, что делаем и по какому распоряжению (наряду) – второй и третий;

  • Счет 40 (Выпуск продукции). Где будем хранить готовую продукцию, что будем хранить, по какому документу пришло на склад;

  • Счет 50 (Касса). Без аналитики;

  • Счет 60 (Расчеты с поставщиками и подрядчиками). Кому и за какую накладную платить;

  • Счет 62 (Расчеты с покупателями и заказчиками). С кого и за какую накладную деньги требовать;

  • Счет 68 (Расчеты по налогам и сборам). Аналитики нет;

  • Счет 70 (Расчеты с персоналом по оплате труда). Кому платить за работу то будем?

  • Счет 90 (Продажи). Что продали;

  • Счет 99 (Прибыли и убытки). Без аналитики;

  • Сведем все в столь любимую нами таблицу:








    Вхождение вида расчета в группу


    Посчитаем все начисления текущего сотрудника за январь:

    1-й вариант:

    ВсегоНачислено = 0;

    ЖЗ.ВыбратьЗаписиПоОбъекту (ТекСотр, ДатаНач, ДатаКон);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    ....Если ЖЗ.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления)=1 Тогда

    ..........ВсегоНачислено = ВсегоНачислено + ЖЗ.Результат;

    ....КонецЕсли;

    КонецЦикла;
    2-й вариант:

    ВсегоНачислено = 0;

    ЖЗ.ВыбратьЗаписиПоОбъекту (ТекСотр, ДатаНач, ДатаКон);

    Пока ЖЗ.ПолучитьЗапись()=1 Цикл

    ....Если ГруппаРасчетов.ВсеНачисления.СодержитВидРасчета(ЖЗ.ВидРасч)=1 Тогда

    ..........ВсегоНачислено = ВсегоНачислено + ЖЗ.Результат;

    ....КонецЕсли;

    КонецЦикла;




    Виды конструктуров


    Конструкторы объектов метаданных — вспомогательные инструменты, облегчающие создание объектов метаданных системы 1С:Предприятие.
    Конфигуратор включает конструкторы:
  • справочника;

    · документа;

    · журнала документов;

    · отчета;

    · вида субконто;

    · журнала расчетов.

  • Конструктор печати предназначен для облегчения процесса создания печатной формы справочника (элемента и списка), документа и журнала документов.
    Назначение Конструктора макета отчета — автоматическое создание шаблона печатной формы объекта метаданных.
    Назначение Конструктора бухгалтерских запросов — автоматическое создание отчета или алгоритма обработки для получения бухгалтерских итогов в одном из нескольких возможных разрезов.
    Конструктор запросов облегчает разработку модулей, в которых используется механизм запросов системы 1С:Предприятие. Конструктор запросов позволяет сформировать текст нового запроса в полуавтоматическом режиме, последовательно заполняя выдаваемые на экран диалоги.
    Конструктор ввода на основании предназначен для создания процедуры ввода на основании в модуле формы документа.
    Конструктор движений регистров помогает создать в модуле документа оперативного учета алгоритм формирования изменений в регистрах, которые необходимо выполнить при проведении данного документа;
    Конструктор формирования операции упрощает оформление в модуле документа бухгалтерского учета бухгалтерской операции генерируемой этим документом.
    Для работы с текстами в системе используется специальный агрегатный тип данных — «Текст». Этот объект предназначен для формирования отчетов в текстовом виде, а также для обмена информацией с другими программами посредством текстовых файлов. Средства языка имеют возможность не только вывода строк в текстовые файлы, но и считывания имеющихся файлов с последующим разбором его по строкам.




    Виды предопределенных процедур


    В системе 1С существуют следующие виды предопределенных процедур:








    Виды расчета


    Для описания алгоритмов, по которым выполняются те или иные вычисления, служит понятие виды расчетов. На этапе конфигурирования можно описать неограниченное количество видов расчетов. В отличие от справочников, журналов расчета и документов, за понятием «вид расчета» не лежит реальных данных — это не более чем алгоритм вычисления, оперирующий данными журналов расчета, документов и справочников.
    Алгоритм вида расчета описывается с помощью встроенного языка. Типичными примерами видов расчетов являются «начисление по окладу», «подоходный налог».
    Приоритет
    Часто очень важным бывает очередность, в которой выполняются те или иные расчеты. Например, в случае расчета заработной платы, как минимум, важно сначала рассчитать начисления, а затем удержания.
    Для организации последовательности выполнения расчетов служит понятие их приоритета. Этот параметр может принимать значение от 0 до 999 и действует следующим образом: чем меньше приоритет расчета, тем раньше он выполняется. Это отражается в последовательности расположения записей журнала расчетов — записи с видами расчетов меньшего приоритета располагаются перед записями с видами расчетов большего приоритета.
    Вытесняющие расчеты
    В некоторых случаях требуется автоматизировать предметные области, в которых расчет каких-либо величин может вестись взаимно исключающими способами. Возвращаясь вновь к задаче расчета заработной платы, рассмотрим пример расчета следующих начислений: оплата рабочих дней по окладу, оплата дней болезни по больничному листу и оплата дней отпуска.
    Очевидно, что в этом случае выполняется условие взаимоисключения перечисленных видов расчета — нельзя, например, одновременно и болеть и работать, т. е. получать и оклад, и деньги по больничному листу. Такие расчеты взаимно исключают друг друга во времени и система должна гарантировать, что ввод одного из них приведет к исключению другого. (Как выяснилось из реальной жизни можно заболеть во время отпуска ;-)




    Виды субконто


    Для ведения аналитического учета в 1С используется термин "субконто". Субконто в системе 1С:Предприятие называется объект аналитического учета. Термином «субконто» могут быть обозначены любые объекты аналитического учета: основные средства, нематериальные активы, материалы, организации, подотчетные лица, договоры, бюджеты. Видом субконто, в свою очередь, называется множество однотипных объектов аналитического учета. Например, вид субконто "Контрагенты" типа Справочник.Контрагенты, субконто - "Магазин Красная Заря".
    В 1С у счета может быть до 5 прикрепленных видов субконто. Максимальное количество видов субконто задается в Конфигураторе, но не может превышать 5.
    Пример, вывести все виды субконто, прикрепленные к заданному счету:
    Счета = СоздатьОбъект("Счет.Основной");

    Счета.НайтиПоКоду("10.1");

    Для Ном = 1 По Счета.КоличествоСубконто() Цикл

    .... Сообщить("Вид субконто " + Счета.ВидСубконто(Ном));

    КонецЦикла;




    Владелец


    Перебор элементов справочника принадлежащих элементу другого справочника.

    Один справочник подчинен другому справочнику, например спр. НалоговыеЛьготы подчинен спр. Сотрудники.




    Если вы производите непосредственное удаление


    Если вы производите непосредственное удаление элемента, то следите, чтобы на него не было ссылок в других объектах. Например, удаляемый сотрудник может использоваться в документе Отпуск. При его удалении ссылочная целостность базы данных будет нарушена. В этом случае рекомендуется пользоваться пометкой на удаление.
    Можно программно получить список объектов, содержащих ссылку на удаляемый объект методом НайтиСсылки(объект).



    в 1С часто называется


    Иерархический справочник - это также многоуровневый
    справочник, или справочник с группами.

    Группа справочника в 1С часто называется "родитель".



    В Конфигураторе можно задать для


    В Конфигураторе можно задать для реквизита то, что он действителен только для элемента, только для группы или для обоих. Например, поле ДатаПриема не имеет смысла для группы Работающие. Поэтому не стоит обращаться к реквизитам элементов, если вы работаете с группой и наоборот.



    Эти методы можно применять, если


    Эти методы можно применять, если ранее не применялся метод ИспользоватьДату



    В Конфигураторе можно задать для


    В Конфигураторе можно задать для реквизита то, что он действителен только для элемента, только для группы или для обоих. Например, поле ДатаПриема не имеет смысла для группы Работающие. Поэтому не стоит обращаться к реквизитам элементов, если вы работаете с группой и наоборот.



    Возможность выбора группы в реквизите диалога


    Часто бывает удобно для реквизитов на форме, имеющих тип Справочник, отключить возможность выбора группы. Тогда в данное поле может быть выбран только элемент и не может быть выбрана группа. В общем, проще один раз попробовать, чем несколько раз объяснять.
    Форма.ВыбрСотрудник.ВыборГруппы(0); //отключить возможность выбора группы




    Временный расчет регистров


    Временный расчет регистров требуется, если нужно выбрать итоги или движения на определенную дату. По умолчанию итоги регистров выдаются на Точку актуальности.

    РегТовары = СоздатьОбъект("Регистр.Товары");

    РегДоходы = СоздатьОбъект("Регистр.Доходы");
    //установка флага временного расчета для регистров

    РегТовары.ВременныйРасчет(1);

    РегДоходы.ВременныйРасчет(1);
    1. Метод РассчитатьРегистрыНа

    Рассчитать все регистры с установленным флагом временного расчета на начало события.

    (на начало даты или на момент до проведения документа)

    2. Метод РассчитатьРегистрыПо

    Рассчитать все регистры с установленным флагом временного расчета на конец события.

    (на конец даты или на момент после проведения документа)




    Время документа


    Кроме даты, позиция документа обозначается временем. С ним можно поступать так:
    Часы = 0;

    Минуты = 0;

    Секунды = 0;

    Док.ПолучитьВремя(Часы, Минуты, Секунды); // Прочтем время

    Если Часы > 21 Тогда
    Предупреждение("Хватит работать по ночам!

    |Документ будет помещен в конец дня");

    Док.АвтоВремяКонецДня(); // документ запишется на 10 сек позже последнего
    ИначеЕсли Часы < 8 Тогда
    Предупреждение("Никто не оценит!

    |Документ будет записан в начало дня");

    Док.АвтоВремяНачалоДня();// документ запишется на 10 сек раньше первого
    ИначеЕсли Вопрос("Записать документ с текущим временем?", 4) = 7 Тогда // ответ "Нет"
    ВвестиЧисло(ЧасУст, "Укажите час, с которым будет записан данный документ",2,0);

    Док.УстановитьВремя(ЧасУст, Минуты, Секунды); // запишется с этим временем
    Иначе
    Док.АвтоВремяТекущее(); // документ запишется с текущим временем
    КонецЕсли;




    Встроенный язык


    Поведение объектов конфигурации задается на встроенном языке. Программист может писать на встроенном языке 1С свои собственные модули, состоящие из процедур и функций. Встроенный язык позволяет работать со справочниками, документами и другими объектами 1С. Можно, например, с помощью методов объектов выбрать все элементы справочника Сотрудники для вывода в отчет, или создать и сохранить любой документ.




    Ввод записей в журнал расчетов


    Записи в журнал расчетов обычно вводятся при проведении документов.
    ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");

    ЖЗ.УстановитьРеквизит("Рассчитана",1);

    ЖЗ.ВвестиРасчет(ВыбрСотрудник, ВидРасчета.Премия, НачалоМесяца, КонецМесяца, ПремияСотруднику);
    или
    ЖЗ.ЗаписатьРасчет(ВыбрСотрудник, ВидРасчета.Премия, НачалоМесяца, КонецМесяца, ПремияСотруднику);
    Отличие метода ЗаписатьРасчет заключается в том, что ввод вытесняющих расчетов приводит к вытеснению только тех расчетов, которые имеют меньший приоритет, а не меньший либо равный, как в случае с методом ВвестиРасчет. Это приводит, в частности, к тому, что за счет применения этого метода расчет не вытесняет «сам себя».
    При записи невытесняющего расчета ввод новых записей также происходит «осмотрительно» — новые записи вводятся только в том случае, если в журнале расчетов нет точно такой же записи. Под точно такой же записью здесь подразумевается запись с таким же видом расчета, для того же объекта и с тем же периодом действия.




    Выгрузка и загрузка списка значений


    //выгрузка в другой список значений или таблицу значений

    Синтаксис: Выгрузить(<Знач>,<НачПоз>,<Колич>)

    СписокЗнач.Выгрузить(НовыйСписок,1,10); //выгрузить первые 10 значений

    //выгрузка списка значений в строку с разделителями

    стр = СписокЗнач.ВСтрокуСРазделителями(); //возвращает строку: 10,12,"Иванов","Петров"
    //загрузка списка значений из строки с разделителями

    //обратите внимание на двойные кавычки для строковых значений

    СписокЗнач.ИзСтрокиСРазделителями("10,12,""Иванов"",""Петров""");




    Выгрузка таблицы значений


    Синтаксис: Выгрузить(<Знач>,<НачСтрока>,<КонСтрока>,<Колонки>)
    //выгрузить 10 сотрудников с наибольшими окладами в новую таблицу значений

    ТабЗнач.Сортировать("Оклад-");

    ТабЗнач.Выгрузить(НоваяТабЗнач,1,10,"Сотрудник,Оклад");




    Вывод секций


    Секция -- это часть таблицы. Секции можно выводить несколько раз, например, в цикле. Вывести секцию -- означает прицепить ее к таблице снизу. После вывода всех секций, таблицу нужно показать на экране.
    Таб.ВывестиСекцию("Шапка");

    Пока ...

    ........Таб.ВывестиСекцию("Сотр");

    КонецЦикла;

    Таб.ВывестиСекцию("Подвал");




    Загрузка измененной конфигурации


    Обычно пользователи спокойно работают с базой данных, пока вы вносите какие-то изменения в свою локальную копию. Потом вы загружаете измененную конфигурацию в рабочую базу и пользователи начинают испытывать блаженство от ваших изменений.
    Объединение конфигураций
    Когда нужно сохранить некоторые особенности оригинальной конфигурации, то применяют этот режим. При этом анализируются различия между конфигурациями и настраивается режим объединения. Это все очень важно и все это нужно будет изучить.
    Язык 1С очень похож на Бейсик. В 1С все ключевые слова можно писать по-русски.








    Заказ


    Экранная форма документа выглядит следующим образом:
    Заказ

    При проведении документа производятся движения в регистре Заказы:
    Процедура ОбработкаПроведения()
    ВыбратьСтроки();

    Пока ПолучитьСтроку()=1 Цикл
    Регистр.Заказы.Товар = Товар;

    Регистр.Заказы.Клиент = Клиент;

    Регистр.Заказы.ДатаДоставки = ДатаДоставки;

    Регистр.Заказы.Заказ = ТекущийДокумент();

    Регистр.Заказы.Цена = Цена;

    Регистр.Заказы.Количество = Количество;

    Регистр.Заказы.Сумма = Сумма;

    Регистр.Заказы.ДвижениеПриходВыполнить();
    КонецЦикла;
    КонецПроцедуры




    Запись движений в оборотный регистр


    (только при проведении документа)
    1. Метод Движение

    Пример: Регистр.Товары.Движение (ПоступившийТовар, ТекСклад, КолвоПоНакладной, СуммаПоНакладной)

    2. Метод ДвижениеВыполнить

    Пример:

    Регистр.Товары.Товар = ПоступившийТовар;

    Регистр.Товары.Склад = ТекСклад;

    Регистр.Товары.Количество = КолвоПоНакладной;

    Регистр.Товары.Стоимость = СуммаПоНакладной;

    Регистр.Товары.ДвижениеВыполнить();

    Примечание: Если сумма или количество в движении будет отрицательным, то это движение будет расходом, иначе приходом.




    Запись движений в регистр остатков


    (только при проведении документа)р.Доходы.ДвижениеПриход(Покупатель,КупленныйТовар,СуммаПокупки)
    Методы ДвижениеПриходВыполнить и ДвижениеРасходВыполнить

    Пример:
    Регистр.Доходы.Клиент = Покупатель;

    Регистр.Доходы.Товар = КупленныйТовар;

    Регистр.Доходы.Доход = СуммаПокупки;

    Регистр.Доходы.ДвижениеПриходВыполнить();




    Запись в файл DBF


    Файл = создатьОбъект("XBASE"); //создаем ссылку на файл DBF
    //определяем структуру файла

    //Синтаксис: ДобавитьПоле(<Название>,<Тип>,<Длина>,<Точность>)
    Файл.ДобавитьПоле("NAME","S",50,0);

    Файл.ДобавитьПоле("PRICE","N",10,2);
    Файл.СоздатьФайл("catalog.dbf"); //создаем файл физически
    СпрТовары.ВыбратьЭлементы();

    Пока СпрТовары.ПолучитьЭлемент()=1 Цикл

    .......Файл.Добавить();

    .......Файл.NAME = СпрТовары.Наименование;

    .......Файл.УстановитьЗначениеПоля("PRICE",СпрТовары.Цена) //так тоже можно;

    .......Файл.Записать();

    КонецЦикла;

    Файл.ЗакрытьФайл(); //не забывайте пожалуйста




    Запрос к регистру


    В запросах к регистрам применяются функции НачОст, КонОст, Приход, Расход. В запросах к оборотным регистрам обязательно указывается Период.
    ТекстЗапроса = "

    |Период С ДатаНач По ДатаКон;

    |Товар = Регистр.Доходы.Товар;

    |Клиент = Регистр.Доходы.Клиент;

    |Доход = Регистр.Доходы.Доход;

    |Условие (Товар = ТекТовар);

    |Группировка Клиент;

    |Функция ПриходПоКлиенту = Приход(Доход);

    |";




    Запрос к справочнику


    Поиск элемента справочника можно организовать через Запрос. Часто это бывает удобнее, если применяется сложное условие отбора. Подробнее см. Запросы




    Запрос к справочнику


    Перебор элементов справочника можно организовать через Запрос. Часто это бывает удобнее, если применяется сложное условие отбора или группировка элементов. Подробнее см. Запросы




    Журнал "Чат"


    Данный журнал показывает документы "Сообщение" и является неким подобием чата. Любой пользователь может создать новый документ Сообщение и сохранить его, тогда через пару секунд его увидят остальные пользователи в этом журнале. Связь состоялась.
    Журнал

    При нажатии на кнопку "Что мне сказали" производится отбор только тех сообщений, которые были адресованы текущему пользователю. Кнопка "Все сообщения" опять показывает все сообщения всем пользователям.




    Журнал "Письма"


    Этот журнал представляет из себя почтовый ящик. При открытии журнала показываются письма только текущего пользователя. Это нужно для того, чтобы пользователи не смотрели чужие почтовые ящики.
    Журнал





    Журналы документов


    Все документы хранятся в журналах. Журнал документов -- это электронный аналог обычной бумажной папки. На экране журнал выглядит как таблица, строки которой являются документами. Например, вы можете создать журнал Приказы кадровые, который будет включать документы "Приказ о приеме на работу", "Приказ об увольнении", "Кадровое перемещение". С этим журналом будет работать пользователь-кадровик. Или можно создать отдельный журнал для банковских документов, куда войдут документы "Платежное поручение" и др.
    Журналы документов предназначены для просмотра документов. Каждый вид документа может быть отнесен к определенному журналу. Сам журнал документов не добавляет новых данных в систему, а служит только как средство просмотра списка документов одного или нескольких видов. Для документов разных видов можно указывать один журнал, что позволяет произвольным образом группировать документы в журналах. Назначенный документам журнал можно менять. Например, может быть создан журнал «Складские документы», который будет содержать все приходные накладные и накладные на внутреннее перемещение. Назначенный документам журнал можно менять.
    Для журнала могут быть определены графы журнала, для удобства просмотра реквизитов различных видов документов, отнесенных к данному журналу. Для журнала может быть описано несколько форм его визуального представления.
    Для работы с документами могут использоваться специально созданные общие журналы. От «обычных» журналов документов их отличает возможность отбора документов по значению, указанному пользователем.
    Журналы в системе 1С могут быть трех видов: Обычный, Общий и Дополнительный. Обычный журнал предназначен для хранения документов определенных видов. Документ также может быть включен в дополнительный журнал, при этом документ будет зарегистрирован сразу в двух журналах. Дополнительных журналов может быть несколько. Общий журнал показывает документы всех видов.
    У журнала документов есть экранная форма, где можно настраивать отображаемые колонки. Можно создавать дополнительные колонки, которые будут отображать информацию из документов. Например, в журнале ПриказыКадровые удобно сразу видеть, к какому сотруднику относится каждый документ, для этого создается Графа журнала Сотрудник




    Журналы расчетов


    Журнал расчетов предназначен для хранения данных сложных периодических расчетов, поддерживаемых компонентой «Расчет», и их предыстории. Основным свойством журнала расчетов является его принадлежность тому или иному справочнику системы. Такой справочник называется справочником объектов расчета. Фактически, справочник определяет вид объектов, по которым ведется расчет. Например, это может быть: журнал расчетов зарплаты, причем списком объектов расчета будет выступать справочник сотрудников; журнал расчетов дивидендов, тогда списком объектов расчета будет выступать справочник акционеров; журнал расчетов амортизации — списком объектов расчета будет выступать справочник основных средств. В процессе конфигурирования настраивается неограниченное число журналов расчета, каждый из которых будет решать ту или иную задачу предметной области.
    Непременными атрибутами каждой записи журнала расчетов являются: объект, для которого данный расчет проведен (обычно сотрудник); вид расчета, по которому данный расчет проведен; дата начала и дата окончания действия данного расчета и результат расчета.
    Для одного справочника могут быть созданы несколько журналов расчетов, каждый из которых будет содержать данные определенной предметной области. Например, в том случае, если предприятие — акционерное общество закрытого типа, справочник сотрудников может выступать списком объектов расчета для журнала расчетов заработной платы и для журнала расчетов дивидендов акционеров.




    

        Бухгалтерия: Автоматизация - Система 1С