Руководство программиста в 1С
 
			
						Введение :
Данная книга предназначена для студентов колледжей и вузов изучающих программирование в среде 1С. В книге рассмотрена версия системы 8.5. На момент написания книги она является пока пробной версий. Но это не отменяет ее актуальности. Выход на рынок данной системы это вопрос времени. Идея написать данное пособие возникла в связи потребность у самого автора в четких и понятных пособиях содержащих точно работающие примеры. Дело в том что при всем изобилии литературы касающейся данной системы практически нет руководств содержащих курс программирования с описанием ( именно программирования всех обьектов).
Данная книга содержит примеры которые обкатаны на указанной выше платформе 1С и которые точно работают. Читателю не будет необходимости вести поиск примеров по интернету ( где надо сказать почти ни чего содержательного нет).
В книге содержатся именно примеры программирования а не скопированные из двухтомника который выпускается самой фирмой варианты команд.
Надеюсь что прочитав данную книгу и отработав все примеры читатель останется вполне доволен материалом который излагается в книге.
Общая информация
Версия 8.5.1
Версия 8.5.1 включает исправления обнаруженных ошибок и изменения в функциональности.
Бета-версия 8.5.1 системы «1С:Предприятие» включает в себя новый интерфейс Версия 8.5. Ключевые возможности и особенности интерфейса Версия 8.5:
Более просторный/воздушный интерфейс (в веб-клиенте также доступен и компактный вариант масштаба интерфейса).
Обновлена отрисовка всего интерфейса и большинства его элементов. Теперь интерфейс более современный.
Поддержка светлой/тёмной темы. Весь интерфейс построен на определенной цветовой палитре, поэтому выглядит более целостным.
Добавлена поддержка карточек.
Все иконки платформы обновлены на более современные контурные, векторные иконки. Как эксперимент в веб-клиенте добавлен новый вариант оконной системы, фокусирующий пользователя на текущих задачах и препятствующий накоплению большого числа открытых окон.
Команды на форме перераспределены.
Переосмыслено использование двойных кликов. Во многих местах действие, ранее доступное по двойному клику, теперь доступно и по одинарному.
Реализовано несколько вариантов представления таблицы в мобильном клиенте (в виде таблицы, в виде списка или в виде карточек).
В таблицах появилась возможность отображать отметки в виде значка или фигуры под текстом.
Бета-версия 8.5.1 системы «1С:Предприятие» позволяет:
Полноценно запускать и работать с конфигурациями, разработанными для предыдущих версий платформы в их исходном интерфейсе (например, Такси).
Создавать новые и адаптировать существующие конфигурации для работы в новом интерфейсе. В конфигураторе реализован механизм рефакторинга Проверка и конвертация для перехода на интерфейс «Версия 8.5», помогающий автоматизировать переход на новый интерфейс.
Создавать конфигурации для гибридного режима работы, когда часть пользователей будет работать в интерфейсе Такси, а часть в новом интерфейсе Версии 8.5.
Для ознакомления с новым интерфейсом подготовлены:
Рекомендации по использованию интерфейса и адаптации конфигураций:
Приведены в разделе справки «Переход на интерфейс «Версия 8.5» – Рекомендации».
Приведены на ИТС (см. здесь).
Рекомендации по совместному использованию в конфигурациях текущего интерфейса и нового интерфейса:
Приведены в разделе справки «Переход на интерфейс «Версия 8.5».
Приведены на ИТС (см. здесь).
Приложение, демонстрирующее интерфейс Версия 8.5, развернуто по адресу https://platform.demo.1c.ru/demo85/.
· Конвертация конфигураций, информационных баз, внешних обработок и внешних отчетов при переходе от предыдущей версии к версии 8.5.1 не требуется.
· Для использования некоторых новых возможностей версии 8.5.1 необходимо отключить режим совместимости. При отключении и включении режима совместимости выполняется изменение структуры некоторых объектов базы данных. Для того, чтобы иметь возможность работать с информационной базой предыдущими версиями, необходимо установить режим совместимости.
Данный фрагмент процитирован с сайта кампании 1С. Раздел обновления и релизы.
Перевод конфигурации с 8.3 в конфигурацию 8.5
Рисунок 1
Шаг 1:
Открыть конфигурацию установить курсор на корневой объект на рисунке 1 курсор находится на этом объекте.
Шаг 2:
Выбрать из появившегося списка пункт меню <Свойства>.
Рисунок 2
Шаг 3:
В появившемся справа списке выполнить действия как на рисунке .
Рисунок 3
После этих действий форма объекта должна будет принять вот такой вид как на рисунке 4 ниже.
Рисунок 4
Это форма объекта обработка после перевода ее в формат 8.5
После пуска программы конфигурация которой переведена из 8.3 в 8.5 все должно обрести вот такой вид. Смотрите рисунок 5.
Рисунок 5
Все созданные вами объекты и связанные с определенными группами теперь находятся слева на панели. Это сделано по умолчанию разработчиками. Если вам не подходит этот внешний вид то на правой панели имеется возможность перенастройки. Смотрите рисунок 6.
Рисунок 6.
Внешний вид можно перенастроить выбрав пункт как на рисунке 7.
Рисунок 7
Таким образом можно поменять внешний вид рабочего стола.
Как увидеть свой объект который создан в конфигурации.
Есть один самый простой путь. Если вы разрабатываете свою конфигурацию. Он показан на рисунке 8 ниже.
Пусть задача состоит в том чтобы найти на рабочем столе обработку под номером 3 который вы создали и привязали к ней ряд программных действий рисунок 8-9-10.
Рисунок 8
Рисунок 9
Рисунок 10
В появившемся списке выбираем обработку 3 и выполняем с ее формой нужные действия.
Для того чтобы наш созданный объект обработка 3 появился на панели слева нужно средствами конфигуратора создать подсистему и привязать обработку как объект к этой подсистеме. См. Рис. 11-14.
Рисунок 11
Рисунок 12
Рисунок 13
Рисунок 14
После выполненных операций на форме рабочего стола на панели меню появится группа обработок. Так как мы включили в эту группу только одну обработку 3, то и появилась на форме только обработка 3.
Работа с документами
Одним из важных обьектов в системе 1С являются документы.
Программная работа с документами позволяет разработчику строить гибкие приложения когда не нужно тратить время на то чтобы разобраться в чужом коде. В большинстве случаев, если не во всех, когда вы занимаетесь программированием данной системы, лучше писать все на уровне своего кода. Сама система конечно позволяет очень многое делать средствами 1С, но это мало имеет отношени я к программированию. Начать изучение лучше всего на мой взгляд с изучения программирования документов. Программировать нужно сразу реальную ситуацию. У преподавателей это называется методика погружения. Это когда сразу ставится реальная и многоходовая задача. Начнем с рассмотрения примера когда в имеющемся документе требуется пройти по табличной части и совершить с некоторыми колонками арифметические операции.
1.0 Создане документа средствами конфигуратора .
Перед началом программирования документа необходимо документ создать. Это можно сделать средствами конфигуратора.
Шаг 1:
Рисунок 15
Шаг 2:
Рисунок 16
ШАГ 3:
На этом шаге происходит создание табличной части и колонок таблицы. Можно изменить имя табличной части которое устанавливается по умолчанию на нужное. Это делается в окне свойств которое находится в правой верхней части рисунка.
Рисунок 17
На панели добавления табличной части есть маленький знак плюса со значением добавить реквизит. Это действие добавляет колонки в таблицу. Добавленные колонки отражены на рисунке 18.
Рисунок 18
В таблицу добавлены три колонки имеющие названия <Реквизит1..3>. Спрва на панели свойств можно увидеть тип данных которые можно вносить в таблицу.
ШАГ 4: Создаем саму форму. Рис 19-20.
Рисунок 19
Рисунок 20
Здесь можно создать форму документа и форму списка документов. После этого можно все сохранить и приступить к формированию формы в визуальном редакторе форм.
1.0.1 Создание кнопки ( команды) на форме.
Привязка програмного кода.
REM: Рассмотренная ниже операция является одинаковой для всех объектов.
1.1
Цикл выборка из табличной части документа.
Задача: Пусть имеется документ в табличной части которого расположена информация о некоторых товарах. Нужно написать цикл прохода по табличной части и в колонку <сумма> записать произведение колонок <количество>*<цена> .
Решение задачи:
&НаСервере
Процедура Команда5НаСервере()
// Вставить содержимое обработчика.
k= Объект.Товары; // Объект.Товары-это табл часть
for each k in Объект.Товары do // цикл движения по таблице
k.Сумма=k.Цена*k.Количество; // расчет суммы
enddo;
КонецПроцедуры
Listing 1
Данный пример показывает с чего вообще нужно начать при программировании документов в системе программирования 1С.
Данный пример работает под управлением платформы 3.5.
Но это не имеет принципиального значения. Начиная с версии 3 и выше структура языка который используется в платформе сильно не отличается.
Следующий шаг в работе с документами это вывод табличной информации на печать. Можно конечно воспользоваться конструктором отчетов который находится в конфигураторе, вот только к программированию непосредственно это отношения не имеет.
Задача: Построить программный вывод таблицы находящейся на форме документа на печать.
Решение задачи:
Создадим новую команду и привяжем ее к форме документа. Далее входим в конструктор кода и пишем следующее.
&НаСервере
Процедура Команда4НаСервере(ТабДок1)
Макет1 = Документы.РасчетОстатков.ПолучитьМакет("Макет");
y=9;
k= Объект.Товары; // Объект.Товары;
for each k in Объект.Товары do
Макет1.Область(y,2).Текст=string(k.Номенклатура);
y=y+1;
enddo;
ТабДок1.Вывести(Макет1);
КонецПроцедуры
&НаКлиенте
Процедура Команда4(Команда)
ТабДок1 = Новый ТабличныйДокумент;
Команда4НаСервере(ТабДок1);
ТабДок1.Показать();
КонецПроцедуры
Listing 2
В данном примере нужно обратить особое внимание что оператор
< ТабДок1.Показать(); >
Нужно применять в процедуре клиенте. В процедуре на сервере данная переменная должна служить параметром.
1.2
Цикл выборка табличных частей из множества документов и выдача выборки в отчет.
Задача: Имеется пачка документов, необходимо написать процедуру которая будет просматривать все документы указанного типа и выдавать табличную часть в отчет.
Решение:
Создадим обработку или отчет, создадим команду и привяжем ее к форме обработки или отчета. Команда простого перебора документов будет иметь следующий вид. Рисунок 5.
&НаСервере
Процедура Команда1НаСервере()
// Вставить содержимое обработчика.
ДокВыборка = Документы.РасчетОстатков.Выбрать();
While ДокВыборка.Следующий() do // это цикл просмотра //документов
// …………………………………….
//……………………………………
Enddo;
КонецПроцедуры
&НаКлиенте
Процедура Команда1(Команда)
Команда1НаСервере();
КонецПроцедуры
Этот фрагмент программы демонстрирует как можно программно методом перебора просмотреть пачку документов.
Приступим к более сложному этапу задачи- просмотра табличной части каждого документа и выдачи данных табличной части на печать.
Решение:
&НаСервере
Процедура Команда2НаСервере(ТабДок1)
// Вставить содержимое обработчика.
Макет1 = Документы.РасчетОстатков.ПолучитьМакет("Макет");
y=9; // начальная строка вывода таблицы
ДокВыборка = Документы.РасчетОстатков.Выбрать();
While ДокВыборка.Следующий() do // это цикл просмотра //документов
// в данный цикл встраваем цикл прохода по табличным частям //документа
k= ДокВыборка.Товары; // Объект.Товары;
for each k in ДокВыборка.Товары do
// строка вывода содержимого колонки в таблицу
Макет1.Область(y,2).Текст=string(k.Номенклатура);
y=y+1; // это счетчик строк таблицы
enddo; // это конец цикла прохода по таблицам документов
Enddo;
ТабДок1.Вывести(Макет1);
КонецПроцедуры
&НаКлиенте
Процедура Команда2(Команда)
ТабДок1 = Новый ТабличныйДокумент;
Команда2НаСервере(ТабДок1);
ТабДок1.Показать();
КонецПроцедуры
Коментарий к программе: в данном программном фрагменте показан механизм перебора документов простой последовательной выборкой без каких либо фильтров или параметров фильтрации.
REM: Нужно обратить внимание что вывод производится в табличный отчет документа расчет остатков этим мы подчеркиваем что данное действие можно осуществлять с любым отчетом.
1.3
Отбор пачки документов по заданному параметру и выдача на печать (Таблицу отчета).
В данном фрагменте кода мы рассмотрим отбор документовв по параметру и выдачу их табличной части на печать в виде формы отчета.
Рассмотрим реализацию данной задачи в двух вариантах один из вариантов – создадим форму отчета поставим на нее кнопку и привяжем к этой кнопке нежеследующий код программы.
Такой эе точно код вставим в процедуру кнопки на форме документа, при этом какой именно возьмем документ не играет ни какой роли. Следует обратить внимание что использовать будем форму одного и того же отчета который находится в документе <РАСЧЕТ ОСТАТКОВ>
Решение:
&НаСервере
Процедура Команда7НаСервере(ТабДок1)
// Вставить содержимое обработчика.
Макет1 = Документы.РасчетОстатков.ПолучитьМакет("Макет");
y=9;
//////////////////////////////////////////////////////////////////
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("FAM1",ЭтотОбъект.Реквизит2);
Запрос.Текст =
"ВЫБРАТЬ
| РасчетОстатков.ГРУППАНОМЕНКЛАТУРЫ КАК ГРУППАНОМЕНКЛАТУРЫ,
| РасчетОстатковТовары.Номенклатура КАК Номенклатура,
| РасчетОстатковТовары.Цена КАК Цена,
| РасчетОстатковТовары.Сумма КАК Сумма
|ИЗ
| Документ.РасчетОстатков.Товары КАК РасчетОстатковТовары
| ПОЛНОЕ СОЕДИНЕНИЕ Документ.РасчетОстатков КАК РасчетОстатков
| ПО РасчетОстатковТовары.Ссылка = РасчетОстатков.Ссылка
|ГДЕ
| РасчетОстатков.ГРУППАНОМЕНКЛАТУРЫ = &FAM1
|
|СГРУППИРОВАТЬ ПО
| РасчетОстатков.ГРУППАНОМЕНКЛАТУРЫ,
| РасчетОстатковТовары.Номенклатура,
| РасчетОстатковТовары.Цена,
| РасчетОстатковТовары.Сумма
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура" ;
// form= Объект. ЭтаФорма.ПодчиненныеЭлементы.ТабличнаяЧасть1.пол;// ЭтотОбъект.Элементы.ТабличнаяЧасть1;
РезультатЗапроса=Запрос.Выполнить();
СпособВыборки=ОбходРезультатаЗапроса.ПоГруппировкам;
Vyborka1=РезультатЗапроса.Выбрать(СпособВыборки);
svh=0; svh1=0;
while Vyborka1.Следующий() do
Макет1.Область(y,2).Текст=string(Vyborka1.Номенклатура);
y=y+1 ;
Enddo;
/////////////////////////////////////////////////////////////
ТабДок1.Вывести(Макет1);
КонецПроцедуры
&НаКлиенте
Процедура Команда7(Команда)
ТабДок1 = Новый ТабличныйДокумент;
Команда7НаСервере(ТабДок1);
ТабДок1.Показать();
КонецПроцедуры
Listing 5
Этот фрагмент программного кода можно связывать как с кнопкой на форме документа так и на форме отчета, можно использовать обработку.
Рассмотрим вариант данной задачи для случая когда нам нужно создать внешнюю обработку.
После создания в кнфигураторе обаботки и сохранения ее как внешнюю отчет обработку вставляем данный код изменив в нем только параметр для поиска с <реквизит2 > на < реквизит1>.
&НаСервере
Процедура Команда1НаСервере(ТабДок1)
// Вставить содержимое обработчика.
// Вставить содержимое обработчика.
Макет1 = Документы.РасчетОстатков.ПолучитьМакет("Макет");
y=9;
//////////////////////////////////////////////////////////////////
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("FAM1",ЭтотОбъект.Реквизит1);
Запрос.Текст =
"ВЫБРАТЬ
| РасчетОстатков.ГРУППАНОМЕНКЛАТУРЫ КАК ГРУППАНОМЕНКЛАТУРЫ,
| РасчетОстатковТовары.Номенклатура КАК Номенклатура,
| РасчетОстатковТовары.Цена КАК Цена,
| РасчетОстатковТовары.Сумма КАК Сумма
|ИЗ
| Документ.РасчетОстатков.Товары КАК РасчетОстатковТовары
| ПОЛНОЕ СОЕДИНЕНИЕ Документ.РасчетОстатков КАК РасчетОстатков
| ПО РасчетОстатковТовары.Ссылка = РасчетОстатков.Ссылка
|ГДЕ
| РасчетОстатков.ГРУППАНОМЕНКЛАТУРЫ = &FAM1
|
|СГРУППИРОВАТЬ ПО
| РасчетОстатков.ГРУППАНОМЕНКЛАТУРЫ,
| РасчетОстатковТовары.Номенклатура,
| РасчетОстатковТовары.Цена,
| РасчетОстатковТовары.Сумма
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура" ;
// form= Объект. ЭтаФорма.ПодчиненныеЭлементы.ТабличнаяЧасть1.пол;// ЭтотОбъект.Элементы.ТабличнаяЧасть1;
РезультатЗапроса=Запрос.Выполнить();
СпособВыборки=ОбходРезультатаЗапроса.ПоГруппировкам;
Vyborka1=РезультатЗапроса.Выбрать(СпособВыборки);
svh=0; svh1=0;
while Vyborka1.Следующий() do
Макет1.Область(y,2).Текст=string(Vyborka1.Номенклатура);
y=y+1 ;
Enddo;
/////////////////////////////////////////////////////////////
ТабДок1.Вывести(Макет1);
КонецПроцедуры
&НаКлиенте
Процедура Команда1(Команда)
//Команда1НаСервере();
ТабДок1 = Новый ТабличныйДокумент;
Команда1НаСервере(ТабДок1);
ТабДок1.Показать();
КонецПроцедуры
Из текста программы видно что он не изменяетяс даже когда мы переносим его с одного обьект конфигурации на другой.
1.4 Выполнение операций с элементами таблицы при выполнении запроса на выборку пачки документов.
Задача : Построить запрос к базе данных на выборку пачки документов по определенному произвольно фильтру( например реквит формы). Произвести арифметические действия с таблицами документов и осуществить проводку документов.
Решение:
Запрос будем строить в теле обработки. Это самый надежный способ для того чтобы не портить типовую конфигурацию. Это если вы работаете с типовой конфигурацией. Если конфигурация написана вами то ни какого значения не имеет к какому объекту конфигурации вы будете привязывать запрос.
&НаСервере
Процедура Команда2НаСервере()
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетОстатковТовары.Количество КАК Количество,
| РасчетОстатковТовары.Ссылка
|ИЗ
| Документ.РасчетОстатков.Товары КАК РасчетОстатковТовары";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// ВОТ ЭТА СТРОКА ОЧЕНЬ ВАЖНАЯ ОНА
//ОПРЕДЕЛЯЕТ .ОБЬЕКТ ИЗ КОТОРОГО БЕРЕТСЯ ТАБЛИЧНАЯ ЧАСТЬ
ДокументОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
Для каждого ТекСтрока из ДокументОбъект.Товары Цикл
ТекСтрока.Количество = 77;
КонецЦикла;
ДокументОбъект.Записать();
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Команда2(Команда)
Команда2НаСервере();
КонецПроцедуры
В данной процедуре рассмотрен способ изменения данных в документах посредством запроса. Конечно можно строить прямую выборку документов что в случае с не очень громоздкими базами возможно даже оправдано. Но когда база данных имеет большой обьем и с ней работает большое количество пользователей то вариантам с запросом альтернативы не существует.
Ниже вариант той самой процедуры только в более привычном варианте для тех кто пишет на PASCAL или С.
&НаСервере
Процедура Команда3НаСервере()
// Вставить содержимое обработчика.
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетОстатковТовары.Количество КАК Количество,
| РасчетОстатковТовары.Ссылка
|ИЗ
| Документ.РасчетОстатков.Товары КАК РасчетОстатковТовары";
