Uploaded by Севиндж Кафулова

Шпаргалка 1С

advertisement
Дата
Описание:
Значения данного типа содержит дату григорианского календаря (с 01 января 0001 года)
и время с точностью до 0,1 миллисекунды.
Литералы:
Строка цифр, заключенная в одинарные кавычки вида: 'ГГГГММДДччммсс', где:






ГГГГ - четыре цифры года (включая тысячелетие и век);
ММ - две цифры месяца;
ДД - две цифры даты;
чч - две цифры часа (в 24-х часовом формате);
мм - две цифры минут;
сс - две цифры секунд;
Во встроенном языке в литерале типа Дата обязательно должно задаваться значение
года, месяца и дня. Для задания даты соответствующей началу отсчета достаточно указать
'00010101'. Допускается при указании литералов типа Дата опускать последние символы
(секунды, минуты, часы и т.д.). Это означает, что данные параметры будут равны нулю (для
времени) или единице (для даты). В литерале даты допускается использование различных
разделителей.
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как инициализировать дату константой в 1с 8.3, 8.2
МояДата = '20130724'; // 24.07.2013
/// Как преобразовать строку в дату в 1с 8.3, 8.2
МояДата = Дата("20130724"); // 24.07.2013
/// Как инициализировать дату отдельными компонентами в 1с 8.3, 8.2
МояДата = Дата(2013, 07, 24); // 24.07.2013
/// Как указать в дате часы, минуты и секунды в 1с 8.3, 8.2
МояДата = '20130724132506'; // 24 июля 2013 г. 13 ч. 25 мин. 6 сек.
/// Как узнать год (месяц, день, час, минута, секунда) у
/// даты в 1с 8.3, 8.2
Г
М
Д
Ч
=
=
=
=
Год(МояДата); // 2013
Месяц(МояДата); // 7
День(МояДата); // 24
Час(МояДата); // 13
Ми = Минута(МояДата); // 25
С = Секунда(МояДата); // 6
/// Как получить текущую дату в 1с 8.3, 8.2
Сообщить(ТекущаяДата());
/// Операции с датой в 1с 8.3, 8.2
Сообщить(ТекущаяДата() + 1); // прибавили секунду
Сообщить(ДобавитьМесяц(ТекущаяДата(), 1)); // прибавили месяц
Сообщить(ДобавитьМесяц(ТекущаяДата(), -1)); // отняли месяц
/// Вспомогательные функции для работы с датой в 1с 8.3, 8.2
МояДата = '20130110125905'; // 10 января 2013 года 12:59:05
Сообщить(ДеньГода(МояДата)); // 10
Сообщить(ДеньНедели(МояДата)); // 4 т.е. четверг (нумерация с
понедельника)
Сообщить(НеделяГода(МояДата)); // 2
Сообщить(НачалоГода(МояДата)); // 01.01.2013 0:00:00
Сообщить(КонецГода(МояДата)); // 31.12.2013 23:59:59
Сообщить(НачалоКвартала(МояДата)); // 01.01.2013 0:00:00
Сообщить(КонецКвартала(МояДата)); // 31.03.2013 23:59:59
Сообщить(НачалоМесяца(МояДата)); // 01.01.2013 0:00:00
Сообщить(КонецМесяца(МояДата)); // 31.01.2013 23:59:59
Сообщить(НачалоНедели(МояДата)); // 07.01.2013 0:00:00
Сообщить(КонецНедели(МояДата)); // 13.01.2013 23:59:59
Сообщить(НачалоДня(МояДата)); // 10.01.2013 0:00:00
Сообщить(КонецДня(МояДата)); // 10.01.2013 23:59:59
Сообщить(НачалоЧаса(МояДата)); // 10.01.2013 12:00:00
Сообщить(КонецЧаса(МояДата)); // 10.01.2013 12:59:59
Сообщить(НачалоМинуты(МояДата)); // 10.01.2013 12:59:00
Сообщить(КонецМинуты(МояДата)); // 10.01.2013 12:59:59
КонецПроцедуры
Условный оператор "Если"
Описание:
Оператор Если управляет выполнением программы, основываясь на результате одного или
более логических выражений. Оператор может содержать любое количество групп
операторов, возглавляемых конструкциями ИначеЕсли — Тогда.
Синтаксис:
Если <Логическое выражение> Тогда
// Операторы
[ИначеЕсли <Логическое выражение> Тогда]
// Операторы
[Иначе]
// Операторы
КонецЕсли;
Параметры:
Если
Ключевое слово, которое начинает структуру оператора условного
выполнения.
<Логическое выражение>
Логическое выражение.
Тогда
Операторы, следующие за Тогда выполняются, если результатом
логического выражения является значение Истина.
// Операторы
Исполняемый оператор или последовательность таких операторов.
ИначеЕсли
Логическое выражение, следующее за ключевым словом ИначеЕсли,
вычисляется только тогда, когда условия в Если и всех
предшествующих ИначеЕсли оказались равны Ложь. Операторы,
следующие за конструкцией ИначеЕсли — Тогда, выполняются, если
результат логического выражения в данном ИначеЕсли равен Истина.
Иначе
Операторы, следующие за ключевым словом Иначе, выполняются, если
результаты логических выражений в конструкции Если и всех
предшествующих конструкциях ИначеЕсли оказались равны Ложь.
КонецЕсли
Ключевое слово, которое завершает структуру оператора условного
выполнения.
Тернарный условный оператор
Описание:
Позволяет вычислить одно из двух заданных выражений в зависимости от результата
вычисления логического выражения.
Синтаксис:
?(<Логическое выражение>, <Выражение 1>, <Выражение 2>)
Параметры:
<Логическое выражение>
Логическое выражение, результат вычисления которого определяет
одно из результирующих выражений, которые будут вычислены. Если
результат его вычисления Истина, то будет вычисляться <Выражение
1>. Если результат Ложь – то <Выражение 2>.
<Выражение 1>
Результирующее выражение, которое будет вычисляться, если результат
логического выражения Истина.
<Выражение 2>
Результирующее выражение, которое будет вычисляться, если результат
логического выражения Ложь.
Возвращаемое значение:
Результат вычисления одного из результирующих выражений.
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как составить оператор Если в 1с 8.3, 8.2
Если 1 > 0 Тогда // Истина
// блок операторов
Сообщить("Компьютер выполнит все команды из этого блока.");
Сообщить("Один больше нуля.");
КонецЕсли;
Если 1 < 0 Тогда // Ложь
Сообщить("Один меньше нуля.");
Иначе
Сообщить("Сработает именно эта ветка условного оператора (#А).");
Сообщить("Один больше нуля.");
КонецЕсли;
Если 1 < 0 Тогда // Ложь
Сообщить("Один меньше нуля.");
ИначеЕсли 1 = 0 Тогда // Ложь
Сообщить("Один равен нулю.");
Иначе
Сообщить("Сработает именно эта ветка условного оператора (#Б).");
Сообщить("Один больше нуля.");
КонецЕсли;
/// Как составить тернарный оператор ? в 1с 8.3, 8.2
Текст = ?(1 > 2, "Один больше двух.", "Один не больше двух.");
Сообщить(Текст); // выведет "Один не больше двух."
КонецПроцедуры
Массив
Описание:
Предназначен для доступа к элементам массива, его методам и конструктору.
Элементы коллекции: Произвольный
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл.
При обходе выбираются значения элементов массива.
Возможно обращение к значению элемента посредством оператора [...]. В качестве аргумента
передается индекс значения (нумерация с 0).
Методы:
ВГраница()
Получает наибольший индекс элемента массива.
Вставить(Индекс, Значение)
Вставляет значение в массив по указанному индексу.
Добавить(Значение)
Добавляет элемент в конец массива.
Количество()
Получает количество элементов в массиве.
Найти(Значение)
Выполняет поиск элемента в массиве. Если элемент найден,
возвращается его индекс. Если элемент не найден,
возвращается Неопределено.
Очистить()
Удаляет все значения из массива.
Получить(Индекс)
Получает значение по индексу. Работает аналогично оператору [].
Удалить(Индекс)
Удаляет значение из массива по указанному индексу.
Установить(Индекс, Значение)
Устанавливает значение по индексу. Работает аналогично
оператору [].
Конструкторы:
Новый Массив(ФиксированныйМассив)
На основании фиксированного массива.
Новый Массив(КоличествоЭлементов1, ...
, КоличествоЭлементовN)
По количеству элементов. Создает массив из
указанного количества элементов. Если задано
несколько параметров, то будет создан массив,
элементами которого являются массивы (и так далее в
зависимости от количества параметров). Фактически
конструктор позволяет создать массивы массивов,
которые могут являться аналогом многомерного
массива.
/// Как создать массив (сразу нужного размера) в 1с 8.3, 8.2
&НаКлиенте
Процедура Пример1(Команда)
// в массиве сразу 3 элемента
Числа = Новый Массив(3);
// инициализируем их значениями
Числа[0] = 5;
Числа[1] = Числа[0] * 2; // 10
Числа[2] = Числа[1] * 2; // 20
// выводим на печать
Для Каждого ЭлементМассива из Числа Цикл
Сообщить(ЭлементМассива); // 5 10 20
КонецЦикла;
КонецПроцедуры
/// Как создать пустой массив (с последующим добавлением
/// элементов) в 1с 8.3, 8.2
&НаКлиенте
Процедура Пример2(Команда)
// в массиве 0 элементов
Числа = Новый Массив;
// добавляем последовательно три элемента
Числа.Добавить(100); // (100)
Числа.Добавить(300); // (100, 300)
Числа.Добавить(500); // (100, 300, 500)
// выводим на печать
Для Каждого ЭлементМассива из Числа Цикл
Сообщить(ЭлементМассива); // 100 300 500
КонецЦикла;
КонецПроцедуры
/// Как обойти все элементы массива по индексу в 1с 8.3, 8.2
&НаКлиенте
Процедура Пример3(Команда)
// инициализируем массив: (100, 300, 500)
Числа = Новый Массив;
Числа.Добавить(100);
Числа.Добавить(300);
Числа.Добавить(500);
// пробегаемся от первого (с индексом 0) до последнего
// элемента (с индексом Количество - 1).
Для Индекс = 0 По Числа.Количество() - 1 Цикл
Сообщить(Числа[Индекс]);
КонецЦикла;
КонецПроцедуры
/// Массив может содержать элементы различных типов: числа,
/// строки и т.д.
&НаКлиенте
Процедура Пример4(Команда)
Значения = Новый Массив(4);
Значения[0] = "HELP"; // ("HELP")
Значения[1] = "ME"; // ("HELP", "ME")
Значения[2] = "1C"; // ("HELP", "ME", "1C")
Значения[3] = Формат(2013, "ЧГ=0"); // ("HELP", "ME", "1C", 2013)
Для Каждого ЭлементМассива из Значения Цикл
Сообщить(ЭлементМассива); // HELP ME 1C 2013
КонецЦикла;
КонецПроцедуры
/// Как передать массив в качестве параметра функции в 1с 8.3, 8.2
&НаКлиенте
Функция Метод5(МассивПереданныйПоСсылке)
МассивПереданныйПоСсылке[0] = 10;
Возврат МассивПереданныйПоСсылке[0] * 2;
КонецФункции
&НаКлиенте
Процедура Пример5(Команда)
// инициализация массива из одного элемента: (13)
Числа = Новый Массив(1);
Числа[0] = 13;
// значение первого элемента до вызова функции
Сообщить(Числа[0]); // 13
// массив ВСЕГДА передается в функцию ПО ССЫЛКЕ, значит,
// изменяя массив внутри функции, мы меняем его снаружи
Сообщить(Метод5(Числа)); // 20
// значение первого элемента после вызова функции изменилось
Сообщить(Числа[0]); // 10
КонецПроцедуры
/// Как вернуть массив в качестве результата работы функции
/// в 1с 8.3, 8.2
&НаКлиенте
Функция Метод6()
// инициализация массива (СПАСИБО, ВАМ)
Слова = Новый Массив(2);
Слова[0] = "СПАСИБО";
Слова[1] = "ВАМ";
Возврат Слова;
КонецФункции
&НаКлиенте
Процедура Пример6(Команда)
// инициализация переменной массивом, который возвращает и формирует
// функция Метод6
Слова = Метод6();
// вывод на печать
Для Каждого ЭлементМассива из Слова Цикл
Сообщить(ЭлементМассива); // СПАСИБО ВАМ
КонецЦикла;
КонецПроцедуры
/// Ещё пример на передачу массива в качестве параметра процедуры
/// в 1с 8.3, 8.2
&НаКлиенте
Процедура Метод7(МойМассив)
Если МойМассив <> Неопределено И МойМассив.Количество() > 0 Тогда
Сообщить(МойМассив[0]);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Пример7(Команда)
// инициализация массива: (10, 20)
Числа = Новый Массив(2);
Числа[0] = 10;
Числа[1] = 20;
// печать первого элемента, переданного массива
Метод7(Числа); // 10
Метод7(Неопределено); // ничего
Метод7(Новый Массив); // ничего
КонецПроцедуры
/// Как получить последний элемент массива в 1с 8.3, 8.2
&НаКлиенте
Процедура Пример8(Команда)
// инициализация массива: ("Кошка", "Собака", "Пантера", "Тигр")
Слова = Новый Массив;
Слова.Добавить("Кошка");
Слова.Добавить("Собака");
Слова.Добавить("Пантера");
Слова.Добавить("Тигр");
Сообщить(Слова[Слова.Количество() - 1]); // Тигр
КонецПроцедуры
/// Использование многомерных массивов в 1с 8.3, 8.2
&НаКлиенте
Процедура Пример9(Команда)
// ( ( (), () ), ( (), () ), ( (), () ) )
Слова = Новый Массив(3, 2);
// ( ( "Юрий", "Гагарин" ), ( (), () ), ( (), () ) )
Слова[0][0] = "Юрий";
Слова[0][1] = "Гагарин";
// ( ( "Юрий", "Гагарин" ), ( "Герман", "Титов" ), ( (), () ) )
Слова[1][0] = "Герман";
Слова[1][1] = "Титов";
// ( ( "Юрий", "Гагарин" ), ( "Герман", "Титов" ),
//
( "Валентина", "Терешкова" ) )
Слова[2][0] = "Валентина";
Слова[2][1] = "Терешкова";
// обход всех элементов через конструкцию Для Каждого
Для Каждого Строка Из Слова Цикл
Для Каждого Элемент Из Строка Цикл
Сообщить(Элемент);
КонецЦикла;
Сообщить(" ");
КонецЦикла;
Сообщить(" ");
// обход всех элементов через индекс
Для ИндексСтрока = 0 По Слова.Количество() - 1 Цикл
Для ИндексСтолбец = 0 По Слова[ИндексСтрока].Количество() - 1 Цикл
Сообщить(Слова[ИндексСтрока][ИндексСтолбец]);
КонецЦикла;
Сообщить(" ");
КонецЦикла;
КонецПроцедуры
/// Вставка, удаление и очистка массива в 1с 8.3, 8.2
&НаКлиенте
Процедура Пример10(Команда)
// инициализация пустого массива
Числа = Новый Массив;
// вставка трёх элементов; каждый элемент вставляется в начало
Числа.Вставить(0, 10); // (10)
Числа.Вставить(0, 100); // (100, 10)
Числа.Вставить(0, 1000); // (1000, 100, 10)
// определение последнего индекса
Сообщить(Числа.ВГраница()); // 2
// вывод на печать
Для Индекс = 0 по Числа.ВГраница() Цикл
Сообщить(Числа[Индекс]); // 1000 100 10
КонецЦикла;
// удаление элемента со значением 100
// для этого сначала находим индекс элемента
// если не находим возвращаем Неопределено
Индекс = Числа.Найти(100); // 1
// и удаляем элемент по найденному индексу
Числа.Удалить(Индекс); // (1000, 10)
Сообщить(Числа.ВГраница()); // 1
// удаление всех элементов из массива
Числа.Очистить();
КонецПроцедуры
/// Как из обычного получить фиксированный (неизменяемый)
/// массив в 1с 8.3, 8.2
&НаКлиенте
Процедура Пример11(Команда)
Числа = Новый Массив;
Числа.Добавить(1);
Числа.Добавить(2);
Числа.Добавить(3);
ФиксированныеЧисла = Новый ФиксированныйМассив(Числа);
// Получился константный массив на основе обычного:
// нельзя менять значения имеющихся элементов
// нельзя добавлять новые элементы
// нельзя удалять имеющиеся элементы
КонецПроцедуры
Математика
Число
Описание:
Числовым типом может быть представлено любое десятичное число. Над данными числового
типа определены основные арифметические операции: сложение, вычитание, умножение и
деление. Максимально допустимая разрядность числа 38 знаков.
Литералы:
Набор цифр, написанных непосредственно в тексте модуля вида: [+|]{0|1|2|3|4|5|6|7|8|9}[.{0|1|2|3|4|5|6|7|8|9}] В качестве разделителя целой и дробной части
используется "." (точка).
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как округлить число в 1с 8.3, 8.2
// https://ru.wikipedia.org/wiki/Округление
// до первого знака после запятой
// случай когда (N + 1) знак < 5
Сообщить(Окр(321.123, 1)); // 321.1
// до первого знака после запятой
// случай когда (N + 1) знак >= 5
Сообщить(Окр(321.163, 1)); // 321.2
//
//
//
//
//
особый случай:
если при округлении до N-го знака
(N + 1)-й знак равен 5, а все последующие
знаки равны нулю, то результат округления
будет зависеть от третьего параметра функции Окр
Сообщить(Окр(100.350, 1, РежимОкругления.Окр15как10)); // вернёт 100.3
Сообщить(Окр(100.350, 1, РежимОкругления.Окр15как20)); // вернёт 100.4
// по умолчанию значение третьего параметра
// равно РежимОкругления.Окр15как20 (округление в большую сторону)
/// Как получить целую часть числа в 1с 8.3, 8.2
Сообщить(Цел(12.654)); // 12
/// Как возвести число в степень в 1с 8.3, 8.2
Сообщить(Pow(10, 3)); // 10^3 = 1000
/// Как вычислить остаток от деления в 1с 8.3, 8.2
Сообщить(5 % 3); // 2
/// Как извлечь квадратный корень из числа в 1с 8.3, 8.2
Сообщить(Sqrt(25)); // 5
/// Как вычислить максимальное из нескольких значений в 1с 8.3, 8.2
Сообщить(Макс(1, 2, 3)); // 3
Сообщить(Макс("aaa", "bbb", "ccc")); // ccc
Сообщить(Макс(ТекущаяДата(), ДобавитьМесяц(ТекущаяДата(), 1)));
Сообщить(Макс(Истина, Ложь)); // Истина
/// Как вычислить минимальное из нескольких значений в 1с 8.3, 8.2
Сообщить(Мин(1, 2, 3)); // 1
Сообщить(Мин("aaa", "bbb", "ccc")); // aaa
Сообщить(Мин(ТекущаяДата(), ДобавитьМесяц(ТекущаяДата(), 1)));
Сообщить(Мин(Истина, Ложь)); // Ложь
/// Как вычислить выражение из строки в 1с 8.3, 8.2
Сообщить(Вычислить("1+2")); // 3
Сообщить(Вычислить("ИСТИНА И ЛОЖЬ")); // Нет
Сообщить(Вычислить("Sin(3.14)")); // ~0
Сообщить(Вычислить("Pow(Sin(3.14), 2) + Pow(Cos(3.14), 2)")); // ~1
/// Тригонометрия в 1с 8.3, 8.2
// углы выражаются в радианах
Пи = 3.14;
E = 2.718; // Число Эйлера http://ru.wikipedia.org/wiki/E_(число)
Сообщить(Cos(Пи / 2)); // ~0
Сообщить(ACos(0)); // ~1,57
Сообщить(Sin(Пи / 2)); // ~1
Сообщить(ASin(1)); // ~1,57
Сообщить(Sin(Пи / 2) * Sin(Пи / 2) + Cos(Пи / 2) * Cos(Пи / 2)); // ~1
Сообщить(Sin(Пи / 3) / Cos(Пи / 3)); // 1.73
Сообщить(Tan(Пи / 3)); // 1.73
Сообщить(Tan(ATan(1.73))); // 1.73
// экспонента - возведение числа эйлера в степень X
// http://ru.wikipedia.org/wiki/Экспонента
Сообщить(Pow(E, 2)); // 7,389
Сообщить(Exp(2)); // 7,389
// натуральный логарифм - степень в которую надо
// возвести число эйлера e, чтобы получить X
// http://ru.wikipedia.org/wiki/Натуральный_логарифм
Сообщить(Log(9)); // 2,197
Сообщить(Pow(E, 2.197)); // ~9
// десятичный логарифм - степень в которую надо
// возвести число 10, чтобы получить X
// http://ru.wikipedia.org/wiki/Десятичный_логарифм
Сообщить(Log10(1000)); // 3
Сообщить(Pow(10, 3)); // 1000
/// Как вывести число без пробелов в 1с 8.3, 8.2
Сообщить(Формат(1000000, "ЧГ=0")); // 1000000
КонецПроцедуры
Процедура
Описание:
Ключевое слово Процедура начинает секцию исходного текста, выполнение которого можно
инициировать из любой точки программного модуля, просто указав Имя_процедуры со
списком параметров (если параметры не передаются, то круглые скобки, тем не менее,
обязательны). Если в модуле обычного приложения, модуле управляемого приложения или
общем программном модуле в теле описания процедуры использовано ключевое
слово Экспорт, то это означает, что данная процедура является доступной из всех других
программных модулей конфигурации.
При выполнении оператора Возврат процедура заканчивается и возвращает управление в
точку вызова. Если в тексте процедуры не встретился оператор Возврат, то после выполнения
последнего исполняемого оператора происходит выполнение неявного оператора Возврат.
Конец программной секции процедуры определяется по оператору КонецПроцедуры.
Переменные, объявленные в теле процедуры в разделе Объявления локальных переменных,
являются локальными переменными данной процедуры, поэтому доступны только в этой
процедуре (за исключением случая передачи их как параметров при вызове других процедур,
функций или методов).
Синтаксис:
Процедура <Имя_процедуры>([[Знач] <Парам1> [=<ДефЗнач>], ... ,[Знач] <ПарамN>
[=<ДефЗнач>]])[Экспорт]
// Объявления локальных переменных;
// Операторы;
...
[Возврат;]
// Операторы;
...
КонецПроцедуры
Параметры:
Имя_проц
Назначает имя процедуры.
Знач
Необязательное ключевое слово, которое указывает на то, что следующий за
ним параметр передается по значению, то есть изменение значения формального
параметра при выполнении процедуры никак не повлияет на фактический
параметр, переданный при вызове процедуры. Если это ключевое слово не
указано, то параметр процедуры передается по ссылке, то есть изменение
внутри процедуры значения формального параметра приведет к изменению
значения соответствующего фактического параметра.
Парам1,
..., ПарамN
Необязательный список формальных параметров, разделяемых запятыми.
Значения формальных параметров должны соответствовать значениям
передаваемых при вызове процедуры фактических параметров. В этом списке
определяются имена каждого из параметров так, как они используются в тексте
процедуры. Список формальных параметров может быть пуст.
=ДефЗнач
Необязательная установка значения параметра по умолчанию. Параметры с
установленными значениями по умолчанию можно располагать в любом месте
списка формальных параметров.
Экспорт
Необязательное ключевое слово, которое указывает на то, что данная процедура
является доступной из других программных модулей.
// Объявления
локальных
переменных
Объявляются локальные переменные, на которые можно ссылаться только в
рамках этой процедуры.
// Операторы
Исполняемые операторы процедуры.
Возврат
Необязательное ключевое слово, которое завершает выполнение процедуры и
осуществляет возврат в точку программы, из которой было обращение к
процедуре. Использование данного оператора в процедуре не обязательно.
КонецПроцедуры
Обязательное ключевое слово, обозначающее конец исходного текста
процедуры, завершение выполнения процедуры. Возврат в точку, из которой
было обращение к процедуре.
Функция
Описание:
Ключевое слово Функция начинает секцию исходного текста функции, выполнение которой
можно инициировать из любой точки программного модуля, просто указав Имя_функции со
списком параметров (если параметры не передаются, то круглые скобки, тем не менее,
обязательны). Если в модуле обычного, управляемого приложения, внешнего соединения,
сеанса или общем программном модуле в теле описания функции использовано ключевое
слово Экспорт, то это означает, что данная функция является доступной из всех других
программных модулей конфигурации.
Функции отличаются от процедур только тем, что возвращают Возвращаемое значение.
Конец программной секции функции определяется по оператору КонецФункции.
Вызов любой функции в тексте программного модуля можно записывать как вызов
процедуры, то есть в языке допускается не принимать от функции возвращаемое значение.
Переменные, объявленные в теле функции в разделе Объявления локальных переменных,
являются локальными переменными данной функции, поэтому доступны только в этой
функции (за исключением случая передачи их как параметров при вызове других процедур,
функций или методов).
Синтаксис:
Функция <Имя_функции>([[Знач] <Парам1>[=<ДефЗнач>], ... ,[Знач]
<ПарамN>[=<ДефЗнач>]])[Экспорт]
//Объявления локальных переменных;
// Операторы ;
...
Возврат <Возвращаемое значение>;
// Операторы ;
...
КонецФункции
Параметры:
Имя_функции
Назначает имя функции.
Знач
Необязательное ключевое слово, которое указывает на то, что
следующий за ним параметр передается по значению, т.е.
изменение значения формального параметра при выполнении
функции никак не повлияет на фактический параметр,
переданный при вызове функции. Если это ключевое слово не
указано, то параметр функции передается по ссылке, то есть
изменение внутри функции значения формального параметра
приведет к изменению значения соответствующего фактического
параметра.
Парам1, ..., ПарамN
Необязательный список формальных параметров, разделяемых
запятыми. Значения формальных параметров должны
соответствовать значениям передаваемых при вызове функции
фактических параметров. В этом списке определяются имена
каждого из параметров так, как они используются в тексте
функции. Список формальных параметров может быть пуст.
=ДефЗнач
Необязательная установка значения параметра по умолчанию.
Параметры с установленными значениями по умолчанию можно
располагать в любом месте списка формальных параметров.
Экспорт
Необязательное ключевое слово, которое указывает на то, что
данная функция является доступной из других программных
модулей.
// Объявления локальных
переменных
Объявляются локальные переменные, на которые можно
ссылаться только в рамках этой функции.
// Операторы
Исполняемые операторы функции.
Возврат Возвращаемое значение
Ключевое слово, которое завершает выполнение функции и
возвращает указанное значение в выражение, в котором
используется функция. В качестве возвращаемого значения
может выступать выражение или переменная, значение которого
содержит результат обращения к функции.
КонецФункции
Обязательное ключевое слово, обозначающее конец исходного
текста функции.
/// Как передать в процедуру параметр по ссылке в 1с 8.3, 8.2
&НаКлиенте
Процедура П1(ПараметрПереданныйПоСсылке)
// изменяем значение и внутри и снаружи
ПараметрПереданныйПоСсылке = 25;
КонецПроцедуры
&НаКлиенте
Процедура Пример1(Команда)
Перем А;
А = 1;
// сейчас А равно 1
П1(А);
// а после вызова процедуры уже 25
КонецПроцедуры
/// Как передать в процедуру параметр по значению в 1с 8.3, 8.2
// возможно только для простых типов (число, строка, дата, ... )
// более сложные объекты всё равно будут переданы по ссылке
&НаКлиенте
Процедура П2(Знач ПараметрПереданныйПоЗначению)
// изменяем значение только внутри процедуры
ПараметрПереданныйПоЗначению = 25;
КонецПроцедуры
&НаКлиенте
Процедура Пример2(Команда)
Перем А;
А = 1;
// сейчас А равно 1
П2(А);
// после вызова процедуры А по-прежнему равно 1
КонецПроцедуры
/// Как передать в процедуру массив по значению в 1с 8.3, 8.2
// это можно сделать только через создание копии массива
&НаКлиенте
Процедура П3(Параметр)
// меняем первый элемент массива
Параметр[0] = 25;
// теперь в массиве Параметр
// числа 25 2
КонецПроцедуры
&НаКлиенте
Процедура Пример3(Команда)
Числа = Новый Массив();
Числа.Добавить(1);
Числа.Добавить(2);
// сейчас в массиве числа: 1 2
// создаём копию массива
КопияЧисел = Новый СписокЗначений;
КопияЧисел.ЗагрузитьЗначения(Числа);
КопияЧисел = КопияЧисел.ВыгрузитьЗначения();
// вызываем процедуру, меняющую
// переданный массив
П3(КопияЧисел);
// после вызова процедуры в массиве Числа
// по-прежнему числа: 1 2
КонецПроцедуры
/// Как для параметра процедуры установить значение
/// по умолчанию в 1с 8.3, 8.2
&НаКлиенте
Процедура П4(Имя = "Сергей", Отчество, Фамилия = "не задано")
Сообщить(Имя + " " + Отчество + " " + Фамилия);
КонецПроцедуры
&НаКлиенте
Процедура Пример4(Команда)
П4("Вадим", "Иванович", "Сидоров"); // Вадим Иванович Сидоров
П4("Вадим", "Иванович"); // Вадим Иванович не задано
П4(, "Иванович"); // Сергей Иванович не задано
П4(,,); // Сергей Неопределено не задано
КонецПроцедуры
/// Как в процедуре объявить локальные переменные в 1с 8.3, 8.2
&НаКлиенте
Процедура П5()
// объявляем переменные
// в самом начале процедуры
Перем ч1, ч2;
Перем ч3;
ч1 = 12;
ч2 = 15;
ч3 = 45;
// а вот здесь уже объявлять
// новые переменные нельзя
КонецПроцедуры
&НаКлиенте
Процедура Пример5(Команда)
П5();
КонецПроцедуры
/// Как сделать процедуру доступной из других модулей в 1с 8.3, 8.2
// объявляем эту процедуру в общем модуле Библиотека
&НаКлиенте
Процедура П6() Экспорт
Сообщить("Привет, я процедура П6");
КонецПроцедуры
&НаКлиенте
Процедура Пример6(Команда)
// вызываем экспортную процедуру П6
// из модуля Библиотека
Библиотека.П6();
КонецПроцедуры
/// Как вернуть значение из функции в 1с 8.3, 8.2
&НаКлиенте
Функция Сумма(А, Б)
Возврат А + Б;
КонецФункции
&НаКлиенте
Процедура Пример7(Команда)
Результат = Сумма(5, 3); // 8
Сообщить(Результат);
КонецПроцедуры
Строка
Описание:
Значения данного типа содержат строку в формате Unicode произвольной длины.
Обратите внимание. Для строки в 1С НЕ доступен обход её символов посредством
оператора Для Каждого ... Из ... Цикл. Также НЕ доступно обращение к отдельным символам
посредством оператора [...]. Взятие отдельного символа строки возможно при помощи
специальных функций для работы со строками, например, Сред (см. примеры использования
ниже). При этом нумерация символов в строках 1С идёт с единицы.
Литералы:
Литералы строкового типа представляют собой набор символов заключенных в кавычки.
Для задания в строке символа " (кавычка) необходимо записать две кавычки подряд. Кроме
того, допускаются "многострочные" строковые константы. В исходном тексте многострочные
константы могут задаваться двумя способами:
Между фрагментами, представляющими отдельные строки многострочной строки, не
должно встречаться никаких символов, за исключением пробелов, переводов строки и
строк комментариев.
 Каждая отдельная составляющая не замыкается кавычками, а на каждой последующей
строке помещен символ переноса строки | (вертикальная черта). В этом варианте
комментарии допускаются, если строка начинается с символа комментария //.
&НаКлиенте

Процедура ВыполнитьКод(Команда)
/// Как найти длину строки в 1с 8.3, 8.2
Сообщить(СтрДлина("123456789")); // 9
/// Как взять часть строки в 1с 8.3, 8.2
// как взять N символов слева
Строка = "Иван Грозный";
Сообщить(Лев(Строка, 4)); // Иван
// как взять N символов справа
Строка = "Иван Грозный";
Сообщить(Прав(Строка, 7)); // Грозный
// как взять строку из середины
Строка = "Мама, папа, я.";
// возьмём начиная с 7 индекса 4 символа
Сообщить(Сред(Строка, 7, 4)); // папа
/// Как найти подстроку в 1с 8.3, 8.2
Строка = "Привет, мир!";
Индекс = СтрНайти(Строка, "Привет"); // 1, строки индексируются с единицы
/// Как узнать число вхождений подстроки в строку в 1с 8.3, 8.2
Сообщить(СтрЧислоВхождений("я, я и ещё раз я.", "я")); // 3
/// Как заменить подстроку в строке в 1с 8.3, 8.2
Сообщить(СтрЗаменить("Идёт сильный дождь.", "дождь", "снег"));
/// Как проверить на пустую строку в 1с 8.3, 8.2
Если ПустаяСтрока("
") Тогда
Сообщить("Строка пустая, то есть не содержит значащих символов.");
КонецЕсли;
/// Как удалить незначащие символы из строки в 1с 8.3, 8.2
// слева
Сообщить(СокрЛ("
// справа
Сообщить(СокрП("
// с двух сторон
Сообщить(СокрЛП("
из лесу ёлочку
")); // "из лесу ёлочку
из лесу ёлочку
")); // "
из лесу ёлочку
из лесу ёлочку"
")); // "из лесу ёлочку"
/// Как вставить в строку перенос в 1с 8.3, 8.2
Строка =
"Первая строка" + Символы.ПС +
"Вторая строка" + Символы.ПС +
"Третья строка";
/// Как работать с многострочными строками (нумерация с
/// единицы) в 1с 8.3, 8.2
Сообщить(СтрЧислоСтрок(Строка)); // 3
Сообщить(СтрПолучитьСтроку(Строка, 2)); // "Вторая строка"
/// Верхний, нижний и титульный регистры в 1с 8.3, 8.2
Сообщить(ВРег("россия - родина моя!")); // РОССИЯ - РОДИНА МОЯ!
Сообщить(НРег("МИР, ТРУД, МАЙ!")); // мир, труд, май
Сообщить(ТРег("мама мыла раму")); // Мама Мыла Раму
/// Как получить код символа строки в 1с 8.3, 8.2
"
// код отдельного символа:
//
туда
Сообщить(КодСимвола("A")); // 65
//
и обратно
Сообщить(Символ(65)); // "A"
// код третьего символа в строке
Сообщить(КодСимвола("ABC", 3)); //67
// код первого символа в строке
КодПервогоСимволаФамилии = КодСимвола("Грозный");
Сообщить(КодПервогоСимволаФамилии); // 1043, потому что Unicode.
/// Как преобразовать строку в число в 1с 8.3, 8.2
Сообщить(Число("125.36")); // 125,36
Сообщить(Число("125,36")); // 125,36
/// Как преобразовать число в строку в 1с 8.3, 8.2
Сообщить(25 + "10"); // 35
// если же нужно сложить число и строку как строки
Сообщить(Строка(25) + "10"); // 2510
/// Как разбить строку с разделителями в 1с 8.3, 8.2
Разделитель = ",";
Строки = СтрЗаменить("январь, февраль, март", Разделитель, Символы.ПС);
Для Индекс = 1 По СтрЧислоСтрок(Строки) Цикл
Сообщить(СтрПолучитьСтроку(Строки, Индекс));
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьКодНаСервере()
/// Как сериализовать значение в строку в 1с 8.3, 8.2
Массив = Новый Массив(3);
Массив[0] = 1;
Массив[1] = "Земля";
Массив[2] = 3.14;
Стр = ЗначениеВСтрокуВнутр(Массив);
Сообщить(Стр);
//{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
// {3,
//
//
//
// }
//}
{"N",1},
{"S","Земля"},
{"N",3.14}
/// Как десериализовать значение из строки в 1с 8.3, 8.2
МассивКопия = ЗначениеИзСтрокиВнутр(Стр);
Элемент = МассивКопия[1];
Сообщить(Элемент); // Земля
КонецПроцедуры
Цикл Для
Описание:
Оператор цикла Для предназначен для циклического повторения операторов, находящихся
внутри конструкции Цикл – КонецЦикла.
Перед началом выполнения цикла значение Выражение 1 присваивается
переменной Имя_переменной. Значение Имя_переменной автоматически увеличивается
при каждом проходе цикла. Величина приращения счетчика при каждом выполнении цикла
равна 1.
Цикл выполняется, пока значение переменной Имя_переменной меньше или равно
значению Выражение 2. Условие выполнения цикла всегда проверяется в начале, перед
выполнением цикла.
Синтаксис:
Для <Имя_переменной> = <Выражение 1> По <Выражение 2> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла;
Параметры:
Имя_переменной
Идентификатор переменной (счетчика цикла), значение которой автоматически
увеличивается на 1 при каждом повторении цикла. Так называемый счетчик
цикла.
Выражение 1
Числовое выражение, которое задает начальное значение, присваиваемое
счетчику цикла при первом проходе цикла.
По
Синтаксическая связка для параметра Выражение 2.
Выражение 2
Максимальное значение счетчика цикла. Когда
переменная Имя_переменной становится больше чем Выражение 2, выполнение
оператора цикла Для прекращается.
Цикл
Операторы, следующие за ключевым словом Цикл выполняются, пока значение
переменной Имя_переменной меньше или равно значения Выражение 2.
// Операторы
Исполняемый оператор или последовательность таких операторов.
Прервать
Позволяет прервать выполнение цикла в любой точке. После выполнение этого
оператора управление передается оператору, следующему за ключевым
словом КонецЦикла.
Продолжить
Немедленно передает управление в начало цикла, где производится вычисление
и проверка условий выполнения цикла. Операторы, следующие в теле цикла за
ним, на данной итерации обхода не выполняются.
КонецЦикла
Ключевое слово, которое завершает структуру оператора цикла.
Цикл Для Каждого
Описание:
Оператор цикла Для каждого предназначен для циклического обхода коллекций значений.
При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется
до тех пор, пока не будут перебраны все элементы коллекции.
Синтаксис:
Для Каждого <Имя_переменной_1> Из <Имя_переменной_2> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла;
Параметры:
Имя_переменной_1
Переменная, которой при каждом повторении цикла присваивается значение
очередного элемента коллекции.
Из
Синтаксическая связка для параметра Имя_переменной_2.
Имя_переменной_2
Переменная или выражение, предоставляющее коллекцию. Элементы этой
коллекции будут присваиваться параметру Имя_переменной_1.
Цикл
Операторы, следующие за ключевым словом Цикл выполняются для каждого
элемента коллекции.
// Операторы
Исполняемый оператор или последовательность таких операторов.
Прервать
Позволяет прервать выполнение цикла в любой точке. После выполнение
этого оператора управление передается оператору, следующему за ключевым
словом КонецЦикла.
Продолжить
Немедленно передает управление в начало цикла, где производится
вычисление и проверка условий выполнения цикла. Операторы, следующие в
теле цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла
Ключевое слово, которое завершает структуру оператора цикла.
Цикл Пока
Описание:
Оператор цикла Пока предназначен для циклического повторения операторов, находящиеся
внутри конструкции Цикл – КонецЦикла. Цикл выполняется, пока логическое выражение
равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением
цикла.
Синтаксис:
Пока <Логическое выражение> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла;
Параметры:
Логическое
выражение
Логическое выражение.
Цикл
Операторы, следующие за ключевым словом Цикл, выполняются, пока результат
логического выражения равен Истина.
// Операторы
Исполняемый оператор или последовательность таких операторов.
Прервать
Позволяет прервать выполнение цикла в любой точке. После выполнение этого
оператора управление передается оператору, следующему за ключевым
словом КонецЦикла.
Продолжить
Немедленно передает управление в начало цикла, где производится вычисление и
проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним,
на данной итерации обхода не выполняются.
КонецЦикла
Ключевое слово, которое завершает структуру оператора цикла.
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как организовать цикл в 1с 8.3, 8.2
// Для Цикл
Для Счетчик = 1 По 5 Цикл
Сообщить(Счетчик); // 1 2 3 4 5
КонецЦикла;
// Для Каждого Цикл
Дни = Новый Массив();
Дни.Добавить("Понедельник");
Дни.Добавить("Вторник");
Дни.Добавить("Среда");
Для Каждого Элемент Из Дни Цикл
Сообщить(Элемент); // Понедельник Вторник Среда
КонецЦикла;
// Пока Цикл
Счетчик = 0;
Пока Счетчик < Дни.Количество() Цикл
Сообщить(Дни[Счетчик]); // Понедельник Вторник Среда
Счетчик = Счетчик + 1;
КонецЦикла;
/// Как организовать обратный цикл в 1с 8.3, 8.2
Счетчик = Дни.Количество() - 1;
Пока Счетчик >= 0 Цикл
Сообщить(Дни[Счетчик]); // Среда Вторник Понедельник
Счетчик = Счетчик - 1;
КонецЦикла;
/// Как прервать цикл в 1с 8.3, 8.2
Для Счетчик = 1 По 5 Цикл
Если Счетчик > 2 Тогда
Прервать;
КонецЕсли;
Сообщить(Счетчик); // 1 2
КонецЦикла;
/// Как принудительно продолжить цикл в 1с 8.3, 8.2
Для Счетчик = 1 По 5 Цикл
Если Счетчик <> 3 Тогда
Продолжить;
КонецЕсли;
Сообщить(Счетчик); // 3
КонецЦикла;
КонецПроцедуры
// ***** Немодальные версии диалогов ***
/// Как немодально вывести диалог вопроса с заголовком и нужными
/// кнопками в 1с 8.3, 8.2
&НаКлиенте
Процедура ДиалогСВопросом(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса",
ЭтотОбъект);
ПоказатьВопрос(Оповещение,
"Вы добрый человек?",
РежимДиалогаВопрос.ДаНетОтмена,
0, // таймаут в секундах
КодВозвратаДиалога.Да, // (необ.) кнопка по умолчанию
"Хороший вопрос" // (необ.) заголовок
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Сообщить("Какой вы молодец!");
КонецЕсли;
КонецПроцедуры
/// Как немодально вывести предупреждение пользователю в 1с 8.3, 8.2
&НаКлиенте
Процедура ПредупреждениеПользователю(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияПредупреждение",
ЭтотОбъект);
ПоказатьПредупреждение(
Оповещение,
"Будьте осторожны.", // предупреждение
0, // (необ.) таймаут в секундах
"Это предупреждение." // (необ.) заголовок
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияПредупреждение(Параметры) Экспорт
КонецПроцедуры
/// Как немодально открыть значение для интерактивной
/// работы с ним в 1с 8.3, 8.2
&НаКлиенте
Процедура ПоказЗначенияДляИнтерактивнойРаботыСНим(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияЗначения",
ЭтотОбъект);
ПоказатьЗначение(Оповещение, 23.56);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияЗначения(Параметры) Экспорт
КонецПроцедуры
/// Как немодально ввести дату от пользователя
/// в 1с 8.3, 8.2
&НаКлиенте
Процедура КакИнтерактивноВвестиДатуОтПользователя(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВводаДаты", ЭтотОбъект);
ПоказатьВводДаты(
Оповещение,
, // пропускаем начальное значение даты
"Введите дату рождения",
ЧастиДаты.Дата
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаДаты(Дата, Параметры) Экспорт
Если Не Дата = Неопределено Тогда
Сообщить("Вы родились " + Дата);
КонецЕсли;
КонецПроцедуры
/// Как немодально ввести значение определенного
/// типа от пользователя в 1с 8.3, 8.2
&НаКлиенте
Процедура КакИнтерактивноВвестиЗначениеОпределенногоТипа(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВводаЗначения",
ЭтотОбъект);
ПоказатьВводЗначения(
Оповещение,
, // пропускаем начальное значение
"Введите значение",
"Число"
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаЗначения(Результат, Параметры) Экспорт
Если Не Результат = Неопределено Тогда
Сообщить(Результат);
КонецЕсли;
КонецПроцедуры
/// Как немодально ввести строку от пользователя в 1с 8.3, 8.2
&НаКлиенте
Процедура КакНемодальноВвестиСтроку(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВводаСтроки",
ЭтотОбъект);
ПоказатьВводСтроки(
Оповещение,
, // пропускаем начальное значение
"Введите строку",
0, // (необ.) длина
Истина // (необ.) многострочность
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаСтроки(Результат, Параметры) Экспорт
Если Не Результат = Неопределено Тогда
Сообщить(Результат);
КонецЕсли;
КонецПроцедуры
/// Как немодально ввести число определенного типа от
/// пользователя в 1С 8.3, 8.2
&НаКлиенте
Процедура КакНемодальноВвестиЧислоОпределенногоТипа(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВводаЧисла",
ЭтотОбъект);
ПоказатьВводЧисла(
Оповещение,
, // пропускаем начальное значение
"Введите число",
3, // длина числа, включая дробную часть без разделителя
1 // длина дробной части
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаЧисла(Результат, Параметры) Экспорт
Если Не Результат = Неопределено Тогда
Сообщить(Результат);
КонецЕсли;
КонецПроцедуры
// ***** Модальные версии диалогов *****
&НаКлиенте
Процедура МодальныеВерсииДиалогов(Команда)
Перем Ч;
Перем Стр;
Перем Дата;
/// Как модально вывести диалог вопроса с заголовком
/// и нужными кнопками в 1с 8.3, 8.2
Ответ = Вопрос("Вы добрый человек?",
РежимДиалогаВопрос.ДаНетОтмена,
0, // таймаут в секундах
КодВозвратаДиалога.Да, // (необ.) кнопка по умолчанию
"Хороший вопрос" // (необ.) заголовок
);
Если Ответ = КодВозвратаДиалога.Да Тогда
Сообщить("Какой вы молодец!");
КонецЕсли;
/// Как модально обработать прерывание операции от пользователя
/// (нажатие Break)
// Расскоментировать для испытаний
// Пока Истина Цикл
// если пользователь нажал break, чтобы прервать выполнение кода
// прервется не только цикл, но и весь поток кода
// ОбработкаПрерыванияПользователя();
// КонецЦикла;
/// Как модально вывести предупреждение пользователю в 1с 8.3, 8.2
Предупреждение(
"Будьте осторожны.", // предупреждение
0, // (необ.) таймаут в секундах
"Это предупреждение." // (необ.) заголовок
);
/// Как модально открыть значение для интерактивной
/// работы с ним в 1с 8
ОткрытьЗначение(23.56);
// откроет элемент справочника с кодом 1
// Выполнять этот код на сервере, а не на клиенте:
// ОткрытьЗначение(Справочники.Номенклатура.НайтиПоКоду("000000001"));
/// Как очистить служеб. сообщения и вывести предупреждающий
/// сигнал
Для Индекс = 1 По 100 Цикл
Сообщить(Индекс);
КонецЦикла;
Предупреждение("Сейчас все сообщения будут удалены.", 5);
ОчиститьСообщения();
Сигнал();
/// Как указать статус сообщения при выводе в 1с 8.3, 8.2
Сообщить(
"Очень важный текст.",
СтатусСообщения.ОченьВажное //по умолчанию статус Обычное
);
/// Как модально ввести дату от пользователя в 1с 8.3, 8.2
Если
ВвестиДату(Дата, "Введите дату рождения", ЧастиДаты.Дата) = Истина
Тогда
Сообщить("Вы родились " + Дата);
КонецЕсли;
/// Как модально ввести значение определенного типа от
/// пользователя в 1С 8.3, 8.2
Если ВвестиЗначение(Ч, "Введите значение", "Число") Тогда
Сообщить(Ч);
КонецЕсли;
/// Как модально ввести строку от пользователя в 1с 8.3, 8.2
Если ВвестиСтроку(
Стр,
"Введите строку",
0, // (необ.) длина
Истина // (необ.) многострочность
)
Тогда
Сообщить(Стр);
КонецЕсли;
/// Как модально ввести число определенного типа от
/// пользователя в 1С 8.3, 8.2
Если ВвестиЧисло(
Ч,
"Введите число",
3, // длина числа, включая дробную часть без разделителя
1 // длина дробной части
)
Тогда
Сообщить(Ч);
КонецЕсли;
КонецПроцедуры
ОписаниеТипов
Описание:
Представляет собой объект для управления допустимыми типами значений. В основном
предназначен для присвоения в качестве значений соответствующим свойствам других
объектов. Набор допустимых типов и квалификаторы примитивных типов задаются при
создании объекта.
Свойства:
КвалификаторыДаты
Содержит квалификаторы даты - объект, используемый для
описания допустимых значений типа Дата.
КвалификаторыДвоичныхДанных
Содержит квалификаторы двоичных данных.
КвалификаторыСтроки
Содержит квалификаторы строки, используемые для описания
допустимых значений строкового типа.
КвалификаторыЧисла
Содержит квалификаторы числа, используемые для описания
допустимых значений числового типа.
Методы:
ПривестиЗначение(Значение)
Формирует значение на основании описания типа и переданного
значения. Если значение передано, то выполняется проверка на
соответствие значения описанию типа. Если значение соответствует,
то метод возвращает переданное значение. Если значение не
соответствует, то оно приводится к типу, доступному в описании
типа. Если значение не передано, то выдается значение по
умолчанию для данного описания типа.
СодержитТип(Тип)
Определяет, входит ли указанный тип в используемые данным
объектом типы.
Типы()
Получает массив типов, используемые в объекте.
Конструкторы:
Новый ОписаниеТипов(ИсходноеОписаниеТипов,
ДобавляемыеТипы, ВычитаемыеТипы,
КвалификаторыЧисла, КвалификаторыСтроки,
КвалификаторыДаты, КвалификаторыДвоичныхДанных)
Создает описание типов на основании
другого описания типов путем
добавления одних и исключения других
типов. Если новый квалификатор не
указан, будут оставлены квалификаторы
исходного описания типов.
Новый ОписаниеТипов(Типы, КвалификаторыЧисла,
КвалификаторыСтроки, КвалификаторыДаты,
КвалификаторыДвоичныхДанных)
Создает описание типов на основании
заданных типов и квалификаторов для
типов Число, Строка, Дата.
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как сделать описание типа строки (числа, даты, булево)
/// в 1с 8.3, 8.2
ОписаниеЧисла = Новый ОписаниеТипов("Число");
ОписаниеСтроки = Новый ОписаниеТипов("Строка");
ОписаниеДаты = Новый ОписаниеТипов("Дата");
ОписаниеБулева = Новый ОписаниеТипов("Булево");
/// Как сделать описание типа структуры (соответствия,
/// массива) в 1с 8.3, 8.2
ОписаниеСтруктуры = Новый ОписаниеТипов("Структура");
ОписаниеСоответствия = Новый ОписаниеТипов("Соответствие");
ОписаниеМассива = Новый ОписаниеТипов("Массив");
/// Как сделать описание типа справочника в 1с 8.3, 8.2
ОписаниеКонтрагента =
Новый ОписаниеТипов("СправочникСсылка.Контрагенты");
/// Как сделать описание составного типа в 1с 8.3, 8.2
СписокТипов = Новый Массив;
СписокТипов.Добавить("Строка");
СписокТипов.Добавить("Структура");
СписокТипов.Добавить("СправочникСсылка.Контрагенты");
ОписаниеСоставногоТипа = Новый ОписаниеТипов(СписокТипов);
/// Как уточнить описание числа, строки, даты при помощи
/// квалификаторов в 1с 8.3, 8.2
// общее число разрядов - 10, число дробной части - 2
КвалификаторыЧисла =
Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Любой);
ОписаниеЧисла = Новый ОписаниеТипов("Число", КвалификаторыЧисла);
// максимальная длина строки - 20 символов
КвалификаторыСтроки = Новый КвалификаторыСтроки(20);
ОписаниеСтроки = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
// храниться только дата, без времени
КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата);
ОписаниеДаты = Новый ОписаниеТипов("Дата", , ,КвалификаторыДаты);
КонецПроцедуры
Работа с операционной системой
/// Как запустить внешнюю программу и
/// дождаться окончания её выполнения из 1с 8.3, 8.2
&НаКлиенте
Процедура ЗапуститьКалькуляторСОжиданием(Команда)
Перем КодВозврата;
ОткрытьЗначение("Запускаем калькулятор.");
ЗапуститьПриложение(
"calc.exe",
"", // текущий каталог для запускаемого приложения
Истина, // дожидаться завершения работы запущенного приложения
КодВозврата // сюда попадёт код, возвращаемый программой
);
// сюда мы попадём только после того,
// как пользователь закроет окно калькулятора
ОткрытьЗначение("Вы закрыли калькулятор.");
КонецПроцедуры
/// Как запустить внешнюю программу без ожидания
/// окончания её выполнения из 1с 8.3, 8.2
&НаКлиенте
Процедура ЗапуститьКалькуляторБезОжидания(Команда)
Перем КодВозврата;
ЗапуститьПриложение(
"calc.exe",
"", // текущий каталог для запускаемого приложения
Ложь, // дожидаться завершения работы запущенного приложения
КодВозврата // сюда попадёт код, возвращаемый программой
);
// сюда мы попадём сразу после запуска калькулятора
// не дожидаясь его закрытия
КонецПроцедуры
/// Как открыть сайт в браузере по умолчанию
/// в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьСайтВБраузереПоУмолчанию(Команда)
ЗапуститьПриложение("http://helpme1c.ru");
КонецПроцедуры
/// Как открыть сайт в Internet Explorer из 1с 8.3, 8.2
// вариант #1
&НаКлиенте
Процедура КакОткрытьСайтВInternetExplorer(Команда)
Shell = Новый COMОбъект("WScript.Shell");
ProgramFiles = Shell.ExpandEnvironmentStrings("%PROGRAMFILES%");
ЗапуститьПриложение(ProgramFiles +
"\Internet Explorer\iexplore.exe http://helpme1c.ru");
// главный недостаток этого варианта запуска приложения
// с параметрами - нужно указывать полный путь к программе
КонецПроцедуры
// вариант #2 (мелькает чёрное окно)
&НаКлиенте
Процедура КакОткрытьСайтВInternetExplorer_2(Команда)
КомандаСистемы("start iexplore.exe http://helpme1c.ru");
// при запуске приложения с параметрами через команду системы
// полный путь указывать не нужно, но будет мелькать
// чёрное окно
КонецПроцедуры
/// Как открыть файл word или excel из 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФайлWordИлиExcel(Команда)
ЗапуститьПриложение("c:\test.xlsx");
КонецПроцедуры
/// Как открыть конкретную папку в проводнике из 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьПапкуВПроводнике(Команда)
Shell = Новый COMОбъект("WScript.Shell");
WindowsDir = Shell.ExpandEnvironmentStrings("%WINDIR%");
ЗапуститьПриложение(WindowsDir +
"\explorer.exe ""C:\Program files""");
КонецПроцедуры
/// Как выделить нужный файл в проводнике из 1с 8.3, 8.2
&НаКлиенте
Процедура КакВыделитьФайлВПроводнике(Команда)
Shell = Новый COMОбъект("WScript.Shell");
WindowsDir = Shell.ExpandEnvironmentStrings("%WINDIR%");
// откроем проводник с выделенным файлом notepad.exe
ЗапуститьПриложение(WindowsDir +
"\explorer.exe /select,""C:\Windows\notepad.exe""");
КонецПроцедуры
/// Как запустить приложение с параметрами из 1с 8.3, 8.2
&НаКлиенте
Процедура КакЗапуститьПриложениеСПараметрами(Команда)
// Из примеров выше (запуска internet explorer и проводника)
// видно, что для запуска программы с параметрами
// нужно указывать полный путь к программе
// например:
ЗапуститьПриложение("C:\Windows\explorer.exe ""C:\Program files""");
// либо использовать командный интерпретатор Windows,
// но в этом случае будет мелькать чёрное окно
КомандаСистемы("start explorer.exe ""C:\Program files""");
КонецПроцедуры
/// Как выполнить команду операционной системы из
/// приложения в 1с 8
&НаКлиенте
Процедура КакВыполнитьКомандуОперационнойСистемы(Команда)
КомандаСистемы(
"winver", // выполняется через командный интерпретатор windows
"" // текущий каталог
);
КонецПроцедуры
/// Как получить имя компьютера в 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьИмяКомпьютера(Команда)
Сообщить(ИмяКомпьютера()); // например, VOLK
КонецПроцедуры
/// Как получить каталог исполняемых файлов из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьКаталогИсполняемыхФайлов1С(Команда)
// выведет полный путь к папке bin
// из которой запущена 1с
Сообщить(КаталогПрограммы());
// например:
// C:\Program Files (x86)\1cv8t\8.3.4.482\bin\
КонецПроцедуры
/// Как получить каталог для временных файлов из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьКаталогДляВременныхФайлов(Команда)
// получим каталог временных файлов для пользователя,
// от имени которого запущено приложение
Сообщить(КаталогВременныхФайлов()); // например, c:\temp\
КонецПроцедуры
/// Как получить стандартный каталог документов из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьКаталогДокументов(Команда)
Сообщить(КаталогДокументов());
// например
// C:\Users\Пользователь\Documents\
КонецПроцедуры
/// Как получить информацию об экранах (dpi, разрешение)
/// клиента из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьИнформациюОбЭкранах(Команда)
Для Каждого Экран Из ПолучитьИнформациюЭкрановКлиента() Цикл
Сообщить("DPI " + Строка(Экран.DPI) + " Высота: " +
Строка(Экран.Высота) + " Ширина: " + Строка(Экран.Ширина));
КонецЦикла;
// например
// DPI 96 Высота: 1 024 Ширина: 1 280
КонецПроцедуры
/// Как получить рабочий каталог данных пользователя
/// из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьРабочийКаталогДанныхПользователя(Команда)
Сообщить(РабочийКаталогДанныхПользователя());
//
//
//
//
например
C:\Users\Пользователь\AppData\Roaming\1C\1cv8t\..
..01c02859-1a28-4514-b595-2abdc95ebb97\071523a4-5..
..16f-4fce-ba4b-0d11ab7a1893\App\
КонецПроцедуры
/// Как узнать текущий язык, используемый в приложении
/// в 1с 8.3, 8.2
&НаКлиенте
Процедура КакУзнатьТекущийЯзыкСистемы(Команда)
Сообщить(ТекущийЯзыкСистемы()); // ru
КонецПроцедуры
/// Как получить список пользователей операционной системы
/// в 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьСписокПользователейОперационнойСистемы(Команда)
ОткрытьЗначение("Внимание, если у вас учебная версия платформы," +
" то код ниже сработает с ошибкой.");
Для Каждого Пользователь Из ПользователиОС() Цикл
Сообщить(Пользователь.ИмяДомена + ": " +
Пользователь.ИмяСервера +" локальный (" +
Пользователь.Локальный + ")"
);
Для Каждого Имя Из Пользователь.Пользователи Цикл
Сообщить(" " + Имя);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Работа с приложением
/// Как узнать имя текущего пользователя в 1с 8.3, 8.2
&НаКлиенте
Процедура КакУзнатьИмяТекущегоПользователя(Команда)
Сообщить(ИмяПользователя()); // Администратор
КонецПроцедуры
/// Как получить или изменить заголовок окна приложения в 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьИлиИзменитьЗаголовокОкна(Команда)
// заголовок в 1с состоит из двух частей: префикс (короткая часть)
// и сам заголовок (длинная часть)
Сообщить(
ПолучитьКраткийЗаголовокПриложения()
); // обычно пустой
Сообщить(
ПолучитьЗаголовокКлиентскогоПриложения()
); // название конфигурации, например Бухгалтерия предприятия
// сделаем такой заголовок - Ромашка.Бухгалтерия
УстановитьКраткийЗаголовокПриложения("Ромашка");
УстановитьЗаголовокКлиентскогоПриложения("Бухгалтерия");
КонецПроцедуры
/// Как узнать текущий вариант интерфейса в 1с 8.3, 8.2
&НаКлиенте
Процедура КакУзнатьТекущийВариантИнтерфейса(Команда)
Сообщить(
ТекущийВариантИнтерфейсаКлиентскогоПриложения()
); // например, Такси или Версия8_2
КонецПроцедуры
/// Как узнать текущий размер основного шрифта в 1с 8.3, 8.2
&НаКлиенте
Процедура КакУзнатьТекущийРазмерШрифта(Команда)
Сообщить(
ТекущийВариантОсновногоШрифтаКлиентскогоПриложения()
); // Крупный или Обычный
КонецПроцедуры
/// Как подключить или отключить обработчик ожидания
/// для управляемой формы в 1с 8.3, 8.2
&НаКлиенте
Процедура РаботаСОбработчикамиОжиданияФормы(Команда)
// подключаем, чтобы процедура СкажиПривет
// вызвалась через 3 секунды
// процедура СкажиПривет определена чуть ниже
ПодключитьОбработчикОжидания(
"СкажиПривет", // имя процедуры
3, // интервал в секундах
Истина // однократный вызов
);
// тут же отключаем
ОтключитьОбработчикОжидания("СкажиПривет");
КонецПроцедуры
&НаКлиенте
Процедура СкажиПривет()
Сообщить("Привет!");
КонецПроцедуры
/// Как подключить или отключить глобальный обработчик
/// оповещения в 1с 8.3, 8.2
&НаКлиенте
Процедура РаботаСГлобальнымиОбработчикамиОповещения(Команда)
// подключаем экспортируемую процедуру глОбработкаОповещение,
// которая определена в модуле управляемого приложения
// также можно располагать её в одном из общих модулей
ПодключитьОбработчикОповещения("глОбработкаОповещения");
// тут же проводим тест
Оповестить("Кошмар", "Монстр", Объект);
// и отключаем этот обработчик оповещения
ОтключитьОбработчикОповещения("глОбработкаОповещения");
КонецПроцедуры
/// Как узнать скорость клиентского соединения в 1с 8.3, 8.2
&НаКлиенте
Процедура КакУзнатьСкоростьСоединения(Команда)
Сообщить(
ПолучитьСкоростьКлиентскогоСоединения()
); // Низкая или Обычная
КонецПроцедуры
/// Как узнать текущий режим запуска в 1с 8.3, 8.2
&НаКлиенте
Процедура КакУзнатьТекущийРежимЗапуска(Команда)
Сообщить(
ТекущийРежимЗапуска()
); // Авто, ОбычноеПриложение или УправляемоеПриложение
// Неопределено, если внешнее соединение
КонецПроцедуры
/// Как узнать строку соединения инормационной базы в 1с 8.3, 8.2
&НаКлиенте
Процедура КакУзнатьСтрокуСоединенияСБазой(Команда)
// часто из неё можно вытащить полезную информацию
Сообщить(
СтрокаСоединенияИнформационнойБазы()
); // Например, File="D:\Bases\Пустая";
КонецПроцедуры
/// Как заблокировать работу пользователя в 1с 8.3, 8.2
&НаКлиенте
Процедура КакЗаблокироватьРаботуПользователя(Команда)
ЗаблокироватьРаботуПользователя();
КонецПроцедуры
/// Как завершить работу системы (вызывая обработчики
/// закрытия) в 1с 8.3, 8.2
&НаКлиенте
Процедура КакЗавершитьРаботуСистемы(Команда)
ЗавершитьРаботуСистемы(
Истина, // запрашивать возможность
Ложь, // (необ.) перезапустить после завершения
"" // (необ.) дополнительные параметры, если делается перезапуск
);
КонецПроцедуры
/// Как прекратить работу системы (не вызывая обработчики
/// закрытия) в 1с 8.3, 8.2
&НаКлиенте
Процедура КакПрекратитьРаботуСистемы(Команда)
ПрекратитьРаботуСистемы(
Ложь, // (необ.) перезапустить после завершения
"" // (необ.) дополнительные параметры, если делается перезапуск
);
КонецПроцедуры
/// Как запустить ещё один экземпляр 1С Предприятия в 1с 8.3, 8.2
&НаКлиенте
Процедура КакЗапуститьЕщёОдинЭкземпляр1С(Команда)
// выдаст ошибку в учебной версии, так как
// в ней нельзя запускать больше одного сеанса
ЗапуститьСистему(
"", // дополнительные параметры
Истина // дождаться завершения запущенной системы для продолжения
);
КонецПроцедуры
&НаКлиенте
Процедура РаботаСДатой(Команда)
РаботаСДатойНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РаботаСДатойНаСервере()
/// Как узнать часовой пояс сеанса в 1с 8.3, 8.2
Сообщить(
ЧасовойПоясСеанса()
); // например, Australia/Brisbane
/// Как узнать текущую дату сеанса в 1с 8.3, 8.2
Сообщить(
ТекущаяДатаСеанса()
); // например, 16.02.2017 10:32:59
КонецПроцедуры
&НаКлиенте
Процедура РаботаСПравамиИРолями(Команда)
РаботаСПравамиИРолямиНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РаботаСПравамиИРолямиНаСервере()
/// Как узнать есть ли право у текущего пользователя
/// применительно к объекту метаданных в 1с 8.3, 8.2
// Какие могут быть права: Чтение, Изменение , Добавление,
// Удаление, Проведение и т.д. (см. справку к функции
// ПравоДоступа в конфигураторе)
Если ПравоДоступа(
"Чтение", Метаданные.Справочники.Контрагенты
) Тогда
Сообщить("Доступ на чтение к данному справочнику открыт!");
КонецЕсли;
/// Как узнать включает ли определенная роль в себя
/// определенное право применительно к объекту
/// метаданных в 1с 8.3, 8.2
Если Не ПравоДоступа(
"Изменение", Метаданные.Справочники.Контрагенты,
Метаданные.Роли.Администратор
) Тогда
Сообщить("У роли Администратор нет прав на изменения справочника!");
КонецЕсли;
/// Как использовать функцию проверки прав для других пользователей
/// в 1с 8.3, 8.2
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого Пользователь Из Пользователи Цикл
Если ПравоДоступа(
"Чтение", Метаданные.Справочники.Контрагенты,
Пользователь
) Тогда
Сообщить("Доступ для " + Пользователь.Имя + " на чтение
открыт!");
КонецЕсли;
КонецЦикла;
/// Как узнать включена ли определенная роль для
/// текущего пользователя в 1с 8.3, 8.2
Если РольДоступна("Администратор") Тогда
Сообщить("Приветствую тебя, Администратор!");
КонецЕсли;
/// Как проверить право у пользователя и в случае
/// его отсутствия вызвать исключение в 1с 8.3, 8.2
ВыполнитьПроверкуПравДоступа(
"Изменение",
Метаданные.Справочники.Контрагенты
); // Вызовет исключение "Нарушение прав доступа!"
КонецПроцедуры
&НаКлиенте
Процедура КакУзнатьПолноеИмяПользователя(Команда)
КакУзнатьПолноеИмяПользователяНаСервере();
КонецПроцедуры
/// Как узнать полное имя пользователя в 1с 8.3, 8.2
&НаСервереБезКонтекста
Процедура КакУзнатьПолноеИмяПользователяНаСервере()
Сообщить(
ПолноеИмяПользователя()
);
КонецПроцедуры
&НаКлиенте
Процедура РаботаСНастройкамиПользователей(Команда)
РаботаСНастройкамиПользователейНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РаботаСНастройкамиПользователейНаСервере()
/// Как сохранить произвольные настройки пользователя
/// в 1с 8.3, 8.2
// сохраним в настройках имя и фамилию
Настройки = Новый Структура;
Настройки.Вставить("Имя", "Владимир");
Настройки.Вставить("Фамилия", "Милькин");
Настройки.Вставить("Возраст", 31);
ХранилищеОбщихНастроек.Сохранить(
"Обработка.ТестированиеКода", // ключ объекта
"Автор", // ключ настроек
Настройки,
, // описание настроек
ИмяПользователя() // владелец настроек,
// если опустить, то настройки сохранятся
// для текущего пользователя
);
/// Как сохранить произвольные настройки для всех пользователей
/// в 1с 8.3, 8.2
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого Пользователь Из Пользователи Цикл
ХранилищеОбщихНастроек.Сохранить(
"Обработка.ТестированиеКода", // ключ объекта
"Автор", // ключ настроек
Настройки,
, // описание настроек
Пользователь.Имя // владелец настроек
);
КонецЦикла;
/// Как прочитать сохраненные настройки пользователя
/// в 1с 8.3, 8.2
// восстанавливаем сохраненные настройки
ВосстановленныеНастройки = Неопределено;
Попытка
ВосстановленныеНастройки =
ХранилищеОбщихНастроек.Загрузить(
"Обработка.ТестированиеКода", // ключ объекта
"Автор", // ключ настроек
, // описание настроек
ИмяПользователя() // владелец настроек, если
// опустить, то настройки прочитаются
// для текущего пользователя
);
// если настроек нет, то будет возвращено значение "Неопределено"
Исключение
Сообщить("Что-то пошло не так..., возможно не хватает прав.");
КонецПопытки;
Если ВосстановленныеНастройки = Неопределено Тогда
Сообщить("Не получилось прочитать настройки.");
Иначе
Сообщить(ВосстановленныеНастройки.Имя);
Сообщить(ВосстановленныеНастройки.Фамилия);
Сообщить(ВосстановленныеНастройки.Возраст);
КонецЕсли;
/// Как удалить сохраненные настройки пользователя в 1с 8.3, 8.2
ХранилищеОбщихНастроек.Удалить(
"Обработка.ТестированиеКода", // ключ объекта
"Автор", // ключ настроек
ИмяПользователя() // владелец настроек, пропускать нельзя
// если указать Неопределено, то настрйка
// удалиться у всех пользователей
);
/// Как удалить сохраненные настройки у всех пользователей в 1с 8.3, 8.2
ХранилищеОбщихНастроек.Удалить(
"Обработка.ТестированиеКода", // ключ объекта
"Автор", // ключ настроек
Неопределено // владелец настроек, пропускать нельзя
);
КонецПроцедуры
Работа с соответствиями
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как создать соответствие в 1с 8.3, 8.2
СобытияДаты = Новый Соответствие;
// пара ключ (произвольного типа) - значение (произвольного типа)
СобытияДаты.Вставить(1980, "Олимпиада в Москве");
СобытияДаты.Вставить(1961, "Первый полет человека в космос.");
/// Как получить значение соответствия по ключу в 1с 8.3, 8.2
Сообщить(СобытияДаты.Получить(1980)); // "Олимпиада в Москве"
/// Как узнать есть ли соответствие значения ключу в 1с 8.3, 8.2
Если СобытияДаты.Получить(2014) = Неопределено Тогда
Сообщить("В 2014 ничего не произошло.");
КонецЕсли;
/// Как изменить значение ключа созданного соответствия
/// в 1с 8.3, 8.2
СобытияДаты.Вставить(1961, "Первый полет Гагарина в космос.");
/// Как узнать количество элементов соответствия в 1с 8.3, 8.2
Сообщить(СобытияДаты.Количество());
/// Как обойти все элементы соответствия в 1с 8.3, 8.2
Для Каждого Элемент Из СобытияДаты Цикл
Сообщить(Строка(Элемент.Ключ) + " " + Элемент.Значение);
КонецЦикла;
/// Как удалить элемент соответствия в 1с 8.3, 8.2
СобытияДаты.Удалить(1980);
/// Как очистить все элементы соответствия в 1с 8.3, 8.2
СобытияДаты.Очистить();
СписокЗначений
Описание:
Список значений - это не сохраняемый в базе данных объект, который позволяет
строить для решения интерфейсных задач динамические наборы значений и
манипулировать ими (добавлять, редактировать, удалять элементы, сортировать). Он может
быть наполнен значениями любого типа, т.е. в одном списке типы хранимых значений могут
быть разными. Одним из примеров использования данного объекта может служить
организация выбора конкретного документа из списка возможных документов,
сформированного по сложному алгоритму.
Элементы коллекции: ЭлементСпискаЗначений
Для объекта доступен обход коллекции посредством оператора Для каждого … Из …
Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве
аргумента передается индекс элемента (нумерация с 0).
Свойства:
ДоступныеЗначения
Применяется в случаях, когда требуется ограничить возможность задания
значений для элементов списка некоторым подмножеством значений
допустимого типа (если для списка установлено описание
типа). Неопределено - ограничения отсутствуют. Установка этого свойства
влияет на работу диалога редактирования списка значений, элементов
управления "Таблица" и "Поле ввода", связанных со списком значений, а
также на программное добавление-вставку нового элемента списка значений
и установку значений элементам списков.
ТипЗначения
Определяет тип (см. ОписаниеТипов) для значений, которые могут храниться
в элементах данного списка значений.
Методы:
Вставить(Индекс, Значение,
Представление, Пометка, Картинка)
Вставляет новый элемент в список значений на
позицию с указанным индексом.
ВыбратьЭлемент(Заголовок, Элемент)
Вызывает окно для интерактивного выбора одного из
элементов, входящих в список значений. Элемент элемент, на который следует изначально
спозиционировать список значений при
интерактивном выборе. Если значением параметра не
является элемент списка значений, входящий в данный
список, позиционирования не произойдет.
ВыгрузитьЗначения()
Создает массив и копирует в него значения элементов
списка значений.
Добавить(Значение, Представление,
Пометка, Картинка)
Добавляет новый элемент в конец списка значений.
ЗагрузитьЗначения(МассивЗначений)
Загружает список значений значениями из
переданного массива. При этом все прежние элементы
списка удаляются.
ЗаполнитьПометки(Пометка)
Устанавливает пометку у всех элементов списка
значений.
Индекс(Элемент)
Получает индекс элемента в списке значений. Если не
найдено, то возвращается -1.
Количество()
Получает количество элементов списка значений.
НайтиПоЗначению(ИскомоеЗначение)
Осуществляет поиск значения элемента списка
значений. Если ни один элемент не хранит значения,
равного искомому, то возвращается
значение Неопределено.
НайтиПоИдентификатору(Идентификатор)
Получает элемент списка значений по
идентификатору. Если элемент не найден, то
возвращается Неопределено.
ОтметитьЭлементы(Заголовок)
Устанавливает или снимает (интерактивно) пометки у
элементов списка значений. Возвращает Истина, если
в диалоге нажата кнопка "ОК", Ложь - в противном
случае.
Очистить()
Очищает список значений, удаляя из него все
элементы.
ПоказатьВыборЭлемента(
ОписаниеОповещенияОЗакрытии,
Заголовок, Элемент)
Вызывает окно для интерактивного выбора одного из
элементов, входящих в список значений.
ПоказатьОтметкуЭлементов(
ОписаниеОповещенияОЗакрытии,
Заголовок)
Предназначен для интерактивной установки состояний
пометок у элементов списка значений.
Получить(Индекс)
Получает значение по индексу. Работает аналогично
оператору [].
Сдвинуть(Элемент, Смещение)
Сдвигает элемент списка значений на заданное
количество позиций вперед или назад.
Скопировать()
Создает копию списка значений.
СортироватьПоЗначению(Направление)
Сортирует список значений в порядке возрастания или
убывания хранимых элементами значений. См. пример
ниже.
СортироватьПоПредставлению(
Направление)
Сортирует список значений по возрастанию или по
убыванию в алфавитном порядке представлений
входящих в состав списка значений элементов. См.
пример ниже.
Удалить(Элемент)
Удаляет элемент из списка значений, где Элемент индекс удаляемого элемента, либо сам элемент.
Конструкторы:
Новый СписокЗначений
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как создать список значений в 1с 8.3, 8.2
Список = Новый СписокЗначений;
/// Как добавить элемент в список значений в 1с 8.3, 8.2
// параметры метода добавить:
// - значение
// - представление
// - отметка (необ.)
// - картинка (необ.)
Список.Добавить(
1980, // значение элемента
"Год рождения Васи" // представление
);
Список.Добавить(1985, "Год рождения Юли");
// значения могут быть разных типов
Список.Добавить("Полина", "Имя ребёнка");
/// Как вставить элемент в список значений в 1с 8.3, 8.2
// вставляем в позицию №2 (элементы нумеруются с 0)
// элемент со значением 2010 и представлением
// "Год рождения их совместной дочки"
Список.Вставить(2, 2010, "Год рождения их совместной дочки");
/// Как обойти элементы списка значений в 1с 8.3, 8.2
Для Каждого Элемент Из Список Цикл
Сообщить(
Элемент.Представление + ": " +
Строка(Элемент.Значение)
);
КонецЦикла;
/// Как очистить список значений в 1с 8.3, 8.2
Список.Очистить();
Список.Добавить("Понедельник");
Список.Добавить("Вторник");
Список.Добавить("Среда");
/// Как узнать количество элементов списка значений, а также
/// получить элемент списка по его индексу в 1с 8.3, 8.2
// нумерация с нуля
Для Индекс = 0 По Список.Количество() - 1 Цикл
Сообщить(Список[Индекс]);
КонецЦикла;
/// Как найти элемент списка по его значению в 1с 8.3, 8.2
ЗначВторник = Список.НайтиПоЗначению("Вторник");
/// Как узнать индекс элемента в списке в 1с 8.3, 8.2
Сообщить(Список.Индекс(ЗначВторник)); // 1, так как нумерация с нуля
/// Как отсортировать список по его значениям в 1с 8.3, 8.2
// было: понедельник, вторник, среда
Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
// стало: среда, понедельник, вторник
/// Как удалить элемент из списка значений в 1с 8.3, 8.2
// удаляем первый элемент
// параметр: элемент списка
// или индекс элемента
// можно так
Список.Удалить(Список[0]);
// или так
// Список.Удалить(0);
/// Как сдвинуть элемент списка значений в 1с 8.3, 8.2
// сдвигаем нулевой элемент на одну позицию вперёд
// было: понедельник вторник
Список.Сдвинуть(0, 1);
// стало: вторник понедельник
/// Как сделать копию списка в 1с 8
КопияСписка = Список.Скопировать();
Цвета = Новый СписокЗначений;
Цвета.Добавить("Красный");
Цвета.Добавить("Зелёный");
Цвета.Добавить("Синий");
/// Как выгрузить значения списка в массив в 1с 8.3, 8.2
МассивЦветов = Цвета.ВыгрузитьЗначения();
/// Как загрузить значения списка из массива в 1с 8.3, 8.2
Цвета.ЗагрузитьЗначения(МассивЦветов);
КонецПроцедуры
/// Как сделать немодальный выбор значения из списка
/// значений в 1с 8.3, 8.2
&НаКлиенте
Процедура КакСделатьНемодальныйВыборЗначения(Команда)
Цвета = Новый СписокЗначений;
Цвета.Добавить("Красный");
Цвета.Добавить("Зелёный");
Цвета.Добавить("Синий");
// процедура ПослеВыбораЭлемента определена чуть ниже
ОповещениеПослеВыбораЭлемента = Новый ОписаниеОповещения(
"ПослеВыбораЭлемента", ЭтотОбъект
);
Цвета.ПоказатьВыборЭлемента(
ОповещениеПослеВыбораЭлемента,
"Выберите любимый цвет"
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораЭлемента(Элемент, Параметры) Экспорт
Если Элемент <> Неопределено Тогда
Сообщить(Элемент.Значение);
КонецЕсли;
КонецПроцедуры
/// Как сделать немодальную отметку значений из списка
/// значений в 1с 8.3, 8.2
&НаКлиенте
Процедура КакСделатьНемодальнуюОтметкуЗначений(Команда)
Цвета = Новый СписокЗначений;
Цвета.Добавить("Красный");
Цвета.Добавить("Зелёный");
Цвета.Добавить("Синий");
// процедура ПослеОтметкиЭлементов определена чуть ниже
ОповещениеПослеОтметкиЭлементов = Новый ОписаниеОповещения(
"ПослеОтметкиЭлементов", ЭтотОбъект
);
Цвета.ПоказатьОтметкуЭлементов(
ОповещениеПослеОтметкиЭлементов,
"Выберите любимые цвета"
);
// а вот так можно разом установить все отметки
// списка в определенное значение
Цвета.ЗаполнитьПометки(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОтметкиЭлементов(Элементы, Параметры) Экспорт
Если Элементы <> Неопределено Тогда
Для Каждого Цвет Из Элементы Цикл
Если Цвет.Пометка Тогда
Сообщить(Цвет.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
/// Как сделать модальный выбор значения из списка в 1с 8.3, 8.2
&НаКлиенте
Процедура КакСделатьМодальныйВыборЗначения(Команда)
Цвета = Новый СписокЗначений;
Цвета.Добавить("Красный");
Цвета.Добавить("Зелёный");
Цвета.Добавить("Синий");
ВыбЦвет = Цвета.ВыбратьЭлемент("Выберите любимый цвет");
Если ВыбЦвет <> Неопределено Тогда
Сообщить(ВыбЦвет.Значение);
КонецЕсли;
КонецПроцедуры
/// Как сделать модальную отметку значений из списка
/// значений в 1с 8.3, 8.2
&НаКлиенте
Процедура КакСделатьМодальнуюОтметкуЗначений(Команда)
Цвета = Новый СписокЗначений;
Цвета.Добавить("Красный");
Цвета.Добавить("Зелёный");
Цвета.Добавить("Синий");
Если Цвета.ОтметитьЭлементы("Выберите любимые цвета") Тогда
Для Каждого Цвет Из Цвета Цикл
Если Цвет.Пометка Тогда
Сообщить(Цвет.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// а вот так можно разом установить все отметки
// списка в определенное значение
Цвета.ЗаполнитьПометки(Истина);
КонецПроцедуры
Структура
Описание:
Представляет собой коллекцию пар КлючИЗначение. При этом ключ может быть только
строковым и должен удовлетворять требованиям, предъявляемым к именованию
переменных встроенного языка.
К значениям структуры можно обращаться как к свойствам объекта. При этом ключ
используется как имя свойства.
Структура используется обычно для хранения небольшого количества значений, каждое
из которых имеет некоторое имя.
Элементы коллекции: КлючИЗначение
Для объекта доступен обход коллекции посредством оператора Для каждого … Из …
Цикл. При обходе выбираются элементы коллекции.
Свойства:
Имя
ключа
В качестве свойств структура предоставляет элементы. Имя свойства определяется
ключом, а значение свойства определяется значением элемента.
Методы:
Вставить(Ключ, Значение)
Устанавливает значение элемента структуры по ключу.
Если элемент с переданным значением ключа существует,
то его значение заменяется, в противном случае
добавляется новый элемент.
Количество()
Получает количество элементов структуры.
Очистить()
Удаляет все элементы структуры.
Свойство(Ключ, НайденноеЗначение)
Получает значение элемента по указанному имени, а также
проверяет, имеется ли указанное свойство.
Возвращает Истина - ключ найден, Ложь - в противном
случае.
Удалить(Ключ)
Удаляет элемент структуры с заданным ключом.
Конструкторы:
Новый Структура(ФиксированнаяСтруктура)
Создаваемая структура заполняется свойствами из
исходной фиксированной структуры.
Новый Структура(Ключ, Значения)
Создает структуру с ключами, значения которых
передаются в параметре конструктора. Если в
первом параметре заданы ключи элементов
структуры, то в следующих параметрах могут быть
указаны значения этих элементов в том порядке, в
котором они расположены в строке в первом
параметре.
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как создать структуру (способ 1) в 1с 8.3, 8.2
ЛичныеДанные = Новый Структура;
// пара ключ (имя переменной) - значение (произв. типа)
ЛичныеДанные.Вставить("Фамилия", "Иванов");
ЛичныеДанные.Вставить("Имя", "Иван");
ЛичныеДанные.Вставить("ДатаРождения", '19800802');
Сообщить(
ЛичныеДанные.Имя + " " + ЛичныеДанные.Фамилия +
" родился " + ЛичныеДанные.ДатаРождения
);
/// Как создать структуру (способ 2) в 1с 8.3, 8.2
Время = Новый Структура("Часы,Минуты,Секунды", 12, 45, 33);
Сообщить(
"Время " + Время.Часы + ":" + Время.Минуты + ":" +
Время.Секунды
);
/// Как изменить значение поля созданной структуры (способ 1)
/// в 1с 8.3, 8.2
ЛичныеДанные.Вставить("Фамилия", "Сидоров");
/// Как изменить значение поля созданной структуры (способ 2)
/// в 1с 8.3, 8.2
Время.Часы = 13;
/// Как узнать количество элементов структуры в 1с 8.3, 8.2
Сообщить(Время.Количество());
/// Как обойти все элементы структуры в 1с 8.3, 8.2
Для Каждого Элемент Из ЛичныеДанные Цикл
Сообщить(Элемент.Ключ + " " + Элемент.Значение);
КонецЦикла;
/// Как удалить элемент структуры в 1с 8.3, 8.2
ЛичныеДанные.Удалить("ДатаРождения");
/// Как очистить все элементы структуры в 1с 8.3, 8.2
ЛичныеДанные.Очистить();
КонецПроцедуры
Таблица значений
Описание:
Таблица значений - это несохраняемый в базе данных объект, который позволяет строить
динамические наборы значений и манипулировать ими (добавлять, редактировать, удалять
элементы, сортировать). Он может быть наполнен значениями любого типа, т.е. в одной
таблице типы хранимых значений могут быть разными. Одним из примеров использования
данного объекта может служить организация представления в форме списка элементов
справочника, отобранных по сложному алгоритму.
Необходимо отметить, что таблица значений, связанная с элементом управления
ТабличноеПоле, будет иметь все колонки, имеющиеся в табличном поле, с соответствующими
именами. Кроме того, таблица значений может иметь также и собственные колонки, не
отображаемые в табличном поле, при этом их имена должны отличаться от имен колонок
табличного поля.
Элементы коллекции: СтрокаТаблицыЗначений
Для объекта доступен обход коллекции посредством оператора Для каждого … Из …
Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве
аргумента передается индекс строки (нумерация с 0).
Свойства:
Индексы
Содержит коллекцию индексов таблицы значений.
Колонки
Содержит коллекцию колонок таблицы значений.
Методы:
Вставить(Индекс)
Вставляет строку на позицию в таблице значений,
соответствующую указанному индексу. Возвращает
вставленную строку.
ВыбратьСтроку(Заголовок,
НачальнаяСтрока)
Вызывает модальное диалоговое окно для интерактивного
выбора строки из таблицы значений. Возвращает выбранную
строку или Неопределено, если пользователь отказался от
выбора.
ВыгрузитьКолонку(Колонка)
Создает массив и копирует в него значения, содержащиеся в
колонке таблицы значений. Возвращает этот массив.
Добавить()
Добавляет строку в конец таблицы значений. Возвращает
добавленную строку.
ЗагрузитьКолонку(Массив,
Колонка)
Загружает колонку таблицы значений из массива значений.
ЗаполнитьЗначения(Значение,
Колонки)
Заполняет все строки таблицы значений указанным значением.
Индекс(Строка)
Получает индекс строки в коллекции строк таблицы значений.
Если не найдено, то возвращается -1.
Итог(Колонка)
Суммирует значения всех строк в указанной колонке. Если в
колонке установлен тип и он единственный, то при
суммировании будет предприниматься попытка преобразования
значения к типу Число. Если колонке не присвоены типы, то в
процессе суммирования будут принимать участие только
значения, имеющие тип Число, значения других типов будут
игнорироваться. Если в колонке несколько типов и среди них
есть тип Число, то в процессе суммирования будут принимать
участие только значения, имеющие тип Число, значения других
типов будут игнорироваться. Если в колонке несколько типов и
среди них нет типа Число, то результатом будет
значение Неопределено.
Количество()
Получает количество строк таблицы значений.
Найти(Значение, Колонки)
Осуществляет поиск значения в указанных колонках таблицы
значений. Возвращает строку, в которой содержится искомое
значение. Если значение не найдено, то возвращается
значение Неопределено.
НайтиСтроки(ПараметрыОтбора)
Осуществляет поиск строк таблицы значений, отвечающих
заданным условиям поиска. Возвращает массив строк таблицы
значений, соответствующих условиям поиска. Замечание!
Массив хранит ссылки на строки таблицы значений, то есть при
изменении строки в таблице, значение в массиве тоже будет
измененным.
Очистить()
Удаляет все строки таблицы значений. Структура колонок
остается неизменной.
Получить(Индекс)
Получает значение по индексу. Работает аналогично оператору
[].
Свернуть(КолонкиГруппировок,
КолонкиСуммирования)
Осуществляет свертку таблицы значений по указанным
колонкам группировки. Строки, у которых совпадают значения в
колонках, указанных в первом параметре, сворачиваются в одну
строку. Значения этих строк, хранящиеся в колонках, указанных
во втором параметре, накапливаются. Важно! Списки колонок
не должны пересекаться. Колонки, не вошедшие ни в один из
списков колонок, после выполнения метода удаляются из
таблицы значений.
Сдвинуть(Строка, Смещение)
Сдвигает строку на указанное количество позиций.
Скопировать(Строки, Колонки)
Если указаны строки и колонки, то только они будут
скопированы. Если не указаны, то будет создана полная копия
таблицы значений.
СкопироватьКолонки(Колонки)
Создает таблицу значений с заданным списком колонок.
Сортировать(Колонки,
ОбъектСравнения)
Сортирует таблицу значений в соответствии с указанными
правилами сортировки.
Удалить(Строка)
Удаляет строку таблицы значений, где Строка - индекс или
сама строка.
Конструктор:
Новый ТаблицаЗначений
&НаСервере
Процедура ВыполнитьКодНаСервере()
/// Как создать таблицу значений в 1с 8.3, 8.2
// с таблицей значений можно работать только на сервере
Таб = Новый ТаблицаЗначений;
/// Как добавить колонки в таблицу значений в 1с 8.3, 8.2
Таб.Колонки.Добавить("Фрукт");
Таб.Колонки.Добавить("Цвет");
Таб.Колонки.Добавить("Вкус");
/// Как добавить строки в таблицу значений в 1с 8.3, 8.2
Стр = Таб.Добавить();
Стр.Фрукт = "Яблоко";
Стр.Цвет = "Зелёный";
Стр.Вкус = "Кислый";
Стр = Таб.Добавить();
Стр.Фрукт = "Банан";
Стр.Цвет = "Желтый";
Стр.Вкус = "Сладкий";
Стр = Таб.Добавить();
Стр.Фрукт = "Слива";
Стр.Цвет = "Синий";
Стр.Вкус = "Терпкий";
/// Как добавить в таблицу значений колонку с
/// описанием типа и заголовка в 1с 8.3, 8.2
ОписаниеВеса = Новый ОписаниеТипов("Число",
Новый КвалификаторыЧисла(12, 3));
Таб.Колонки.Добавить("ВесФрукта", ОписаниеВеса, "Вес фрукта");
Таб[0].ВесФрукта = 100.005;
Таб[1].ВесФрукта = 60.010;
Таб[2].ВесФрукта = 25.000;
/// Как перечислить все строки в таблице значений в 1с 8.3, 8.2
Для Каждого Стр Из Таб Цикл
Сообщить(Стр.Фрукт + " " + Стр.Цвет + " " + Стр.Вкус +
" " + Стр.ВесФрукта);
КонецЦикла;
/// Как перечислить все колонки в таблице значений
/// в 1с 8.3, 8.2
Для Каждого Колонка Из Таб.Колонки Цикл
Сообщить(Колонка.Имя);
КонецЦикла;
/// Как выгрузить колонку таблицы значений в массив в 1с 8.3, 8.2
// выгрузка названий фруктов в массив
МассивФруктов = Таб.ВыгрузитьКолонку("Фрукт");
// ничего не измениться, так как массив не менялся
Таб.ЗагрузитьКолонку(МассивФруктов, "Фрукт");
/// Как заполнить значения в колонке для всех строк таблицы
/// значений в 1с 8.3, 8.2
// обнулим вес во всех строках
Таб.ЗаполнитьЗначения(0, "ВесФрукта");
// выставим новые веса
Таб[0].ВесФрукта = 100;
Таб[1].ВесФрукта = 60;
Таб[2].ВесФрукта = 25;
/// Как в таблице значений посчитать итог по колонке в 1с 8.3, 8.2
Сообщить(Таб.Итог("ВесФрукта")); // 185
/// Как найти строку в таблице значений по значению в 1с 8.3, 8.2
// найдём строчку с яблоком и покажем его цвет
НайденнаяСтрока = Таб.Найти( "Яблоко" );
Если НайденнаяСтрока <> Неопределено Тогда
Сообщить(НайденнаяСтрока.Цвет); // Зелёный
КонецЕсли;
/// Как найти строку в таблице значений поиском значения
/// в определенных колонках в 1с 8.3, 8.2
// будем искать по слову "Кислый" в колонках вкус и цвет
НайденнаяСтрока = Таб.Найти("Кислый", "Вкус, Цвет");
Если НайденнаяСтрока <> Неопределено Тогда
Сообщить(НайденнаяСтрока.Фрукт); // Яблоко
КонецЕсли;
// добавим ещё один зелёный фрукт
Стр = Таб.Добавить();
Стр.Фрукт = "Киви";
Стр.Цвет = "Зелёный";
Стр.Вкус = "Сладкий";
Стр.ВесФрукта = 30;
/// Как искать в таблице значений неуникальные значения
/// в 1с 8.3, 8.2
Отбор = Новый Структура;
Отбор.Вставить("Цвет", "Зелёный");
Строки = Таб.НайтиСтроки(Отбор);
Для Каждого Стр Из Строки Цикл
Сообщить(Стр.Фрукт); // Яблоко Киви
КонецЦикла;
/// Как сдвинуть строку таблицы значений в 1с 8.3, 8.2
// сдвигаем первую строку на одну позицию вперёд
Таб.Сдвинуть(0, 1);
// и возвращаем обратно
Таб.Сдвинуть(1, -1);
/// Как создать копию таблицы значений в 1с 8.3, 8.2
// полная копия
КопияТаб = Таб.Скопировать();
/// Как создать копию таблицы значений по нужным колонкам
/// в 1с 8.3, 8.2
// только две колонки будет Фрукт и Цвет
КопияТаб = Таб.СкопироватьКолонки("Фрукт, Цвет");
/// Как создать копию таблицы значений по отбору в 1с 8.3, 8.2
Отбор = Новый Структура;
Отбор.Вставить("Фрукт", "Яблоко");
// таблица будет содержать только строчку с яблоком
КопияТаб = Таб.Скопировать(Отбор);
// таблица будет содержать цвет и вес яблока
КопияТаб = Таб.Скопировать(Отбор, "Цвет, ВесФрукта");
/// Как свернуть таблицу значений по колонке в 1с 8.3, 8.2
// свернём по вкусу, просуммируем по весу
Таб.Свернуть("Вкус", "ВесФрукта");
/// Как отсортировать таблицу значений по колонке в 1с 8.3, 8.2
Таб.Сортировать("ВесФрукта Возр");
/// Как отсортировать таблицу значений по нескольким колонкам
/// в 1с 8.3, 8.2
Таб.Сортировать("ВесФрукта Возр, Вкус Убыв");
/// Как удалить строку из таблицы значений в 1с 8.3, 8.2
// по индексу или по значению
Таб.Удалить(0);
КонецПроцедуры
/// Как программно вывести таблицу значений на
/// форму в 1с 8.3, 8.2
// см. примеры использования этой функции ниже
// ТабВКоде - таблица значений, созданная программно
// ТабРеквизит - имя реквизита формы типа ТаблицаЗначений
// ТабНаФорме - имя элемента формы, связанного с ТабРеквизит
&НаСервере
Процедура ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде,
ТабРеквизит, ТабНаФорме)
// реквизит ТабРеквизит и соответствующий
// ему элемент формы ТабНаФорме уже созданы
// нами в визуальном режиме
// 1. добавляем колонки из ТабВкоде в реквизит ТабРеквизит
НовыеРеквизиты = Новый Массив;
Для Каждого Колонка Из ТабВКоде.Колонки Цикл
НовыеРеквизиты.Добавить(
Новый РеквизитФормы(
Колонка.Имя, Колонка.ТипЗначения,
ТабРеквизит
)
);
КонецЦикла;
ИзменитьРеквизиты(НовыеРеквизиты);
// 2. добавляем колонки из ТабВКоде в элемент ТабНаФорме
Для Каждого Колонка Из ТабВКоде.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(
ТабРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТабНаФорм
);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = ТабРеквизит + "." + Колонка.Имя;
КонецЦикла;
// 3. наконец, передаём данные из ТабВКоде в ТабРеквизит
ЗначениеВРеквизитФормы(ТабВКоде, ТабРеквизит);
// готово!
КонецПроцедуры
&НаСервере
Процедура СоздатьТаблицуНаФормеНаСервере()
// программно создаём таблицу значений ТабВКоде
ТабВКоде = Новый ТаблицаЗначений;
ОписаниеСтроки = Новый ОписаниеТипов("Строка");
ОписаниеВеса = Новый ОписаниеТипов("Число",
Новый КвалификаторыЧисла(12, 3));
ТабВКоде.Колонки.Добавить("Фрукт", ОписаниеСтроки, "Имя фрукта");
ТабВКоде.Колонки.Добавить("Цвет", ОписаниеСтроки, "Цвет фрукта");
ТабВКоде.Колонки.Добавить("Вес", ОписаниеВеса, "Вес фрукта");
Стр = ТабВКоде.Добавить();
Стр.Фрукт = "Яблоко";
Стр.Цвет = "Зелёный";
Стр.Вес = 200;
Стр = ТабВКоде.Добавить();
Стр.Фрукт = "Банан";
Стр.Цвет = "Желтый";
Стр.Вес = 150;
ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит1", "ТабНаФо
КонецПроцедуры
/// Как программно вывести на форму результат запроса
/// в виде таблицы значений в 1с 8.3, 8.2
&НаСервере
Процедура ВывестиНаФормуРезультатЗапросаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Товары.Ссылка,
|
Товары.ВерсияДанных,
|
Товары.ПометкаУдаления,
|
Товары.Код,
|
Товары.Наименование,
|
Товары.Цвет,
|
Товары.ЕдиницаИзмерений,
|
Товары.Предопределенный,
|
Товары.ИмяПредопределенныхДанных
|ИЗ
|
Справочник.Товары КАК Товары";
РезультатЗапроса = Запрос.Выполнить();
ТабВКоде = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой);
// функция ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме определена выше
ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит2",
"ТабНаФорме2");
КонецПроцедуры
Работа с файловой системой
&НаСервере
Процедура ЧтениеИЗаписьФайловНаСервере()
/// Как записать произвольное значение в файл в 1с 8.3, 8.2
// любое сериализуемое (то есть превращаемое
// в строку и обратно) значение можно сохранять
// в файл, например, массивы, списки значений, строки
// структуры и т.д.
Числа = Новый Массив;
Числа.Добавить(35);
Числа.Добавить(67);
ЗначениеВФайл("c:\числа.txt", Числа);
// эта функция работает только на сервере
/// Как восстановить произвольное значение из файла в 1с 8.3, 8.2
ЧислаИзФайла = ЗначениеИзФайла("c:\числа.txt");
Сообщить(ЧислаИзФайла[0]); // 35
Сообщить(ЧислаИзФайла[1]); // 67
/// Как записать текстовый файл в 1с 8.3, 8.2
// работает как на сервере, так и на клиенте
Текст = Новый ЗаписьТекста(
"c:\привет.txt", // имя
КодировкаТекста.ANSI, // кодировка
Символы.ПС, // разделитель строк (необ.)
Ложь // перезаписывать файл, а не дописывать в конец (необ.)
);
Текст.ЗаписатьСтроку("Добро пожаловать!");
Текст.ЗаписатьСтроку("Посторонним вход воспрещен.");
Текст.Закрыть();
/// Как прочитать текстовый файл в 1с 8.3, 8.2
// работает как на сервере, так и на клиенте
Текст = Новый ЧтениеТекста(
"c:\привет.txt", // имя
КодировкаТекста.ANSI, // кодировка
Символы.ПС, // разделитель строк (необ.)
,
Истина // монопольный режим (необ.)
);
// читаем пока есть что читать
Пока Истина Цикл
Строка = Текст.ПрочитатьСтроку();
Если Строка = Неопределено Тогда
Прервать;
Иначе
Сообщить(Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОперацииНадФайлами(Команда)
// для тестов создадим пустой файл
Текст = Новый ЗаписьТекста("c:\file_src.txt");
Текст.Закрыть();
/// Как проверить существование файла в 1С 8.3, 8.2
ФайлНаДиске = Новый Файл("c:\file_src.txt");
Если ФайлНаДиске.Существует() Тогда
Сообщить("c:\file_src.txt существует");
КонецЕсли;
/// Как скопировать файл в 1с 8.3, 8.2
КопироватьФайл(
"c:\file_src.txt", // что копируем
"c:\file_dest.txt" // куда копируем
); // перезапишет, если уже есть такой файл
/// Как переместить файл в 1с 8.3, 8.2
ПереместитьФайл(
"c:\file_dest.txt",
"c:\file_new.txt"
); // перезапишет, если уже есть такой файл
/// Как найти файлы в каталоге в 1с 8.3, 8.2
// возвращает массив значений типа Файл
МассивНайденныхФайлов = НайтиФайлы(
"c:\", // где искать
"*.txt", // маска поиска
Ложь // если Истина, то будет искать и в подкаталогах
);
Для Каждого Файл Из МассивНайденныхФайлов Цикл
Сообщить("Найден " + Файл.ПолноеИмя);
КонецЦикла;
/// Как удалить файл в 1с 8.3, 8.2
// если файл readonly - будет ошибка
УдалитьФайлы(
"c:\file_new.txt"
);
/// Как удалить файлы в каталоге по маске в 1с 8.3, 8.2
// поиск в каталоге нерекурсивный
УдалитьФайлы(
"c:\helpme1c", // заведомо не существующий каталог
"*.txt" // маска для поиска удаляемых файлов
); // если опустить маску, то удалятся все файлы и каталог
/// Как получить имя временного файла в 1с 8.3, 8.2
Сообщить(
ПолучитьИмяВременногоФайла()
); // например, c:\Temp\v8_11AE_4.tmp
Сообщить(
ПолучитьИмяВременногоФайла(".txt")
); // например, c:\Temp\v8_11AE_5.txt
/// Как прочитать атрибуты файла в 1с 8.3, 8.2
Ф = Новый Файл("c:\file_src.txt");
// время последнего изменения файла
Сообщить(Ф.ПолучитьВремяИзменения());
// проверяем атрибут только чтение
Сообщить(Ф.ПолучитьТолькоЧтение());
// проверяем атрибут hidden (скрытность, невидимость)
Сообщить(Ф.ПолучитьНевидимость());
/// Как установить атрибуты файла в 1с 8.3, 8.2
// меняем время последнего изменения файла
Ф.УстановитьВремяИзменения(ТекущаяДата());
// меняем атрибут только чтение
Ф.УстановитьТолькоЧтение(Ложь);
// меняем атрибут невидимости
Ф.УстановитьНевидимость(Ложь);
/// Как узнать размер файла в 1с 8.3, 8.2
Сообщить(Ф.Размер()); // в байтах
// Как узнать по пути файл это или каталог в 1с 8.3, 8.2
Если Ф.ЭтоКаталог() Тогда
Сообщить("Это каталог");
ИначеЕсли Ф.ЭтоФайл() Тогда
Сообщить("Это файл");
КонецЕсли;
/// Как вытащить расширение файла из его пути в 1с 8.3, 8.2
Сообщить(Ф.Расширение); // .txt
/// Как вытащить имя файла без расширения в 1с 8.3, 8.2
Сообщить(Ф.ИмяБезРасширения); // file_src
КонецПроцедуры
&НаКлиенте
Процедура ОперацииНадКаталогами(Команда)
/// Как создать каталог в 1с 8.3, 8.2
// каталог может уже существовать
СоздатьКаталог("c:\new_dir");
// создадутся все подкаталоги
СоздатьКаталог("c:\new_dir\2\3");
/// Как проверить существование каталога в 1с 8.3, 8.2
КаталогНаДиске = Новый Файл("c:\new_dir");
Если КаталогНаДиске.Существует() Тогда
Сообщить("Папка c:\new_dir существует");
КонецЕсли;
/// Как удалить каталог вместе с содержимым в 1с 8.3, 8.2
УдалитьФайлы("c:\new_dir");
// мы опустили маску, поэтому удалятся все файлы
// внутри каталога, а также сам каталог
/// Как получить каталог временных файлов в 1с 8.3, 8.2
Сообщить(
КаталогВременныхФайлов()
); // например, c:\temp
КонецПроцедуры
&НаКлиенте
Процедура РаботаСВременнымХранилищем(Команда)
// временное хранилище - объект, в который мы можем помещать
// и считывать данные произвольного типа,
// доступ к которому есть и на сервере и на клиенте
// это позволяет передавать между сервером и клиентом
// данные, которые иначе не передать
/// Как сохранить произвольное значение во временное
/// хранилище в 1с 8.3, 8.2
Список = Новый СписокЗначений;
Список.Добавить("Владивосток");
Список.Добавить("Хабаровск");
Список.Добавить("Петропавловск-Камчатский");
АдресВХранилище = ПоместитьВоВременноеХранилище(
Список // произвольные данные
);
/// Как прочитать произвольное значение из временного
/// хранилища в 1с 8.3, 8.2
СписокИзХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);
Если СписокИзХранилища = Неопределено Тогда
Сообщить("Значение по этому адресу уже удалено из хранилища.");
Иначе
Сообщить(СписокИзХранилища[0]); // Владивосток
КонецЕсли;
/// Как перезаписать уже сохраненное значение во временном
/// хранилище в 1с 8.3, 8.2
Массив = Новый Массив;
Массив.Добавить(10);
Массив.Добавить(20);
ПоместитьВоВременноеХранилище(
Массив,
АдресВХранилище
);
/// Сколько времени хранится значение, сохраненное во
/// временном хранилище в 1с 8.3, 8.2
// всё зависит от второго параметра функции ПоместитьВоВременноеХранилище
// #1 если туда в качестве адреса был передан уникальный идентификатор
формы
// или уже существующий адрес в хранилище, то значение будет
автоматически
// удалено после закрытия формы
// #2 если туда в качестве адреса передан уникальный идентификатор, не
// являющийся уникальным идентификатором формы, то значение будет
// автоматически удалено только после завершения сеанса пользвоателя
// #3 если адрес не указан, помещенное значение будет удалено после
// очередного запроса сервера
// см. примеры ниже
/// Как сохранить значение во временное хранилище на всё
/// время жизни формы в 1с 8.3, 8.2
ПоместитьВоВременноеХранилище(
Массив,
ЭтаФорма.УникальныйИдентификатор
);
/// Как сохранить значение во временное хранилище на всё
/// время сеанса пользователя в 1с 8.3, 8.2
АдресВХранилище = ПоместитьВоВременноеХранилище(
Массив,
Новый УникальныйИдентификатор
);
/// Как удалить значение из временного хранилища в 1с 8.3, 8.2
УдалитьИзВременногоХранилища(АдресВХранилище);
/// Как узнать является ли строка адресом во временном хранилище
Если ЭтоАдресВременногоХранилища(АдресВХранилище) Тогда
Сообщить("Да, это адрес во временном хранилище.");
КонецЕсли;
КонецПроцедуры
/// Как передать файл с клиента на сервер в 1с 8.3, 8.2
&НаКлиенте
Процедура ПередачаФайлаСКлиентаНаСервер(Команда)
// создадим тестовый файл для передачи
Текст = Новый ЗаписьТекста("c:\test.txt");
Текст.ЗаписатьСтроку("Привет,");
Текст.ЗаписатьСтроку("Мир!");
Текст.Закрыть();
ОповещениеОЗавершении = Новый ОписаниеОповещения(
"ВыполнитьПослеПомещенияФайла", ЭтотОбъект
);
НачатьПомещениеФайла(
ОповещениеОЗавершении,
, // адрес в хранилище
"c:\test.txt", // имя файла
Ложь, // интерактивно
ЭтаФорма.УникальныйИдентификатор
);
//
//
//
//
//
//
если опустить последний параметр, то помещенный файл
будет удален после очередного запроса сервера
а если указать - то только после удаления объекта формы
если нужно предоставить пользователю возможность
выбрать файл самому четвёртый параметр (интерактивно)
нужно установить в Истина
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеПомещенияФайла(Результат, Адрес,
ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
// сохраним полученный адрес в реквизит формы
АдресФайлаВХранилище = Адрес;
Сообщить(
"Наконец-то! Файл " +
ВыбранноеИмяФайла + " передан на сервер и сохранён во " +
"временном хранилище по адресу " + Адрес);
Иначе
Сообщить("Не удалось передать файл на сервер.");
КонецЕсли;
КонецПроцедуры
/// Как прочитать файл на сервере из временного хранилища
&НаСервере
Процедура ПрочитатьФайлНаСервереИзХранилищаНаСервере()
Если АдресФайлаВХранилище = "" Тогда
Сообщить("Сначала нужно передать файл с клиента на сервер.");
Возврат;
КонецЕсли;
ДвоичныеДанные =
ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);
Если ДвоичныеДанные = Неопределено Тогда
Сообщить("Похоже файл уже был удалён из хранилища.");
Возврат;
КонецЕсли;
ДвоичныеДанные.Записать("c:\server.txt");
Текст = Новый ЧтениеТекста("c:\server.txt");
Пока Истина Цикл
Строка = Текст.ПрочитатьСтроку();
Если Строка = Неопределено Тогда
Прервать;
Иначе
Сообщить(Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
/// Как передать файл с сервера на клиент в 1с 8.3, 8.2
&НаКлиенте
Процедура ПередатьФайлССервераНаКлиент(Команда)
Если АдресФайлаВХранилище = "" Тогда
Сообщить("Сначала нужно сохранить файл на сервере.");
Сообщить("Воспользуйтесь кнопкой 'Передача файла с клиента...'");
Возврат;
КонецЕсли;
ОповещениеОЗавершении = Новый ОписаниеОповещения(
"ВыполнитьПослеПолученияФайлов", ЭтотОбъект
);
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(
Новый ОписаниеПередаваемогоФайла(
"c:\from_server.txt", // куда сохранять на клиента
АдресФайлаВХранилище // адрес в хранилище на сервере
)
);
НачатьПолучениеФайлов(
ОповещениеОЗавершении,
ПолучаемыеФайлы,
,
Ложь // интерактивно
);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеПолученияФайлов(ПолученныеФайлы,
ДополнительныеПараметры) Экспорт
Для Каждого Файл Из ПолученныеФайлы Цикл
Сообщить("Получен " + Файл.Имя + " из " + Файл.Хранение);
КонецЦикла;
КонецПроцедуры
Формат
Описание:
Формирует удобное для чтения представление значений. Полезно использование в отчетах и
при прочем визуальном отображении значений.
Синтаксис:
Формат(<Значение>, <ФорматнаяСтрока>)
Параметры:
<Значение>
Форматируемое значение.
<ФорматнаяСтрока>
Форматная строка представляет собой строковое значение, включающее параметры
форматирования.
Параметры форматирования перечисляются через символ ";". Наличие параметра означает
отличие форматирования от стандартного.
Если параметр не задан, то применяется стандартное форматирование, которое в основном
соответствует преобразованию значения к строке. Однако для значений типа Число и Дата по
умолчанию (0 и 01.01.0001 00:00:00 соответственно) будет выдаваться пустая строка.
Каждый параметр задается именем параметра, символом "=" и значением параметра.
Значение параметра может указываться в одинарных или двойных кавычках. Это
необходимо, если значение параметра содержит символы, используемые в синтаксисе
форматной строки.
Внутри значения параметра могут указываться произвольные символы, которые при
формировании результирующей строки будут отображаться как есть. Таким образом,
например, можно указывать разделители часов, минут и секунд при форматировании
времени. Если эти символы совпадают со значениями форматной строки, их необходимо
заключать в одинарные кавычки.
Имена и значения параметров форматной строки:







Л - имя языка, страны, для которых будет выполняться стандартное форматирование.
ЧЦ - общее число отображаемых десятичных разрядов целой и дробной частей. Исходное
число округляется при этом в соответствии с правилами округления. Если указан этот
параметр, то для отображения дробной части числа обязательно указание параметра
ЧДЦ, иначе дробная часть отображаться не будет.
ЧДЦ - число десятичных разрядов в дробной части. Исходное число округляется при этом
в соответствии с правилами округления.
ЧС - сдвиг разрядов: положительный - деление, отрицательный - умножение. Другими
словами, это означает, что исходное число будет умножено или поделено на 10*С, где С значение параметра по модулю.
ЧРД - символ-разделитель целой и дробной части.
ЧРГ - символ-разделитель групп целой части числа. Если в качестве разделителя
использовать пустую строку, то в этом случае разделителем будет символ неразрывного
пробела.
ЧН - строка, представляющая нулевое значение числа. Если не задано, то представление в
виде пустой строки. Если задано "ЧН=", то в виде "0". Не используется для числовых
полей ввода.








ЧВН - нужно ли выводить лидирующие нули. Значение данного параметра не задается,
собственно наличие параметра определяет вывод лидирующих нулей.
ЧГ - порядок группировки разрядов числа. В качестве значения указываются числа, через
запятую, обозначающие количество группируемых разрядов справа налево. Имеют смысл
только два первых числа. Первое из них указывает первичную группировку, то есть ту,
которая будет использована для наименее значимых разрядов целой части числа. Если
второе число не указано, то будут сгруппированы только наименее значимые разряды.
Если в качестве второго числа задан 0, то для всех разрядов целой части числа будет
применено значение указанное для первичной группировки. Если в качестве второго
числа используется значение, отличное от 0, то это значение будет использовано для
группировки всех разрядов, кроме уже сгруппированных наименее значимых.
ЧО - представление отрицательных чисел.
 0 (0) - строка вида "(1,1)";
 1 (1) - строка вида "-1,1";
 2 (2) - строка вида "- 1,1";
 3 (3) - строка вида "1,1-";
 4 (4) - строка вида "1,1 -".
ДФ - формат даты.
 д - день месяца (цифрами) без лидирующего нуля;
 дд - день месяца (цифрами) с лидирующим нулем;
 ддд - краткое название дня недели;
 дддд- полное название дня недели ;
 М - номер месяца (цифрами) без лидирующего нуля;
 ММ - номер месяца (цифрами) с лидирующим нулем;
 МММ - краткое название месяца;
 ММММ - полное название месяца;
 к - номер квартала в году;
 г - номер года без века и лидирующего нуля;
 гг - номер года без века с лидирующим нулем;
 гггг - номер года с веком;
 ч - час в 12 часовом варианте без лидирующих нулей;
 чч - час в 12 часовом варианте с лидирующим нулем;
 Ч - час в 24 часовом варианте без лидирующих нулей;
 ЧЧ (HH) - час в 24 часовом варианте с лидирующим нулем;
 м - минута без лидирующего нуля;
 мм - минута с лидирующим нулем;
 с - секунда без лидирующего нуля;
 сс - секунда с лидирующим нулем;
 вв - отображение половины дня AM/PM (действительно только для языков
конфигурирования, поддерживающих 12 часовой вариант представления времени).
ДЛФ - локальный формат даты. Указывается вариант отображения частей даты.
 Д - дата (цифрами);
 ДД - длинная дата (месяц прописью);
 В - полное время, дата может объединяться со временем;
 ДВ - дата время.
ДП - строка, представляющая пустую дату (например, Формат('00010101000000'
,"ДП=""пустая дата""") вернет строку "пустая дата").
БЛ - строка, представляющая логическое значение Ложь.
БИ - строка, представляющая логическое значение Истина.
&НаКлиенте
Процедура ВыполнитьКод(Команда)
/// Как указать общее число цифр в 1с 8.3, 8.2
Сообщить(Формат(125, "ЧЦ=2")); // 99
Сообщить(Формат(125, "ЧЦ=1")); // 9
/// Как указать число цифр после запятой в 1с 8.3, 8.2
Сообщить(Формат(125.368, "ЧДЦ=2")); // 125.37
Сообщить(Формат(125.368, "ЧДЦ=1")); // 125.4
/// Как сдвинуть разряды числа в 1с 8.3, 8.2
Сообщить(Формат(2, "ЧС=1")); // 0,2
Сообщить(Формат(2, "ЧС=-2")); // 200
/// Как задать разделитель целой и дробной части в 1с 8.3, 8.2
Сообщить(Формат(125.36, "ЧРД=^")); // 125^36
/// Как задать разделитель групп в 1с 8.3, 8.2
Сообщить(Формат(10000000, "ЧРГ=*")); // 10*000*000
/// Как задать нулевое представление числа в 1с 8.3, 8.2
Сообщить(Формат(0, "ЧН=ноль")); // ноль
/// Как заставить выводить лидирующие нули в 1с 8.3, 8.2
Сообщить(Формат(125, "ЧЦ=10; ЧВН=")); // 0 000 000 125
Сообщить(Формат(5, "ЧЦ=2; ЧВН=")); // 05
/// Как отключить группировку разрядов при выводе числа
/// в 1с 8.3, 8.2
Сообщить(Формат(1000000, "ЧГ=0")); // 1000000
/// Как получить отдельные компоненты даты при выводе
/// в 1с 8.3, 8.2
Дата = '20050101200103'; // 01 января 2005 года 20:01:03
// год
Сообщить(Формат(Дата, "ДФ=г")); // 5
Сообщить(Формат(Дата, "ДФ=гг")); // 05
Сообщить(Формат(Дата, "ДФ=гггг")); // 2005
// номер квартала
Сообщить(Формат(Дата, "ДФ=к")); // 1
// месяц
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
"ДФ=М")); // 1
"ДФ=ММ")); // 01
"ДФ=МММ")); // янв.
"ДФ=ММММ")); // Январь
// день
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
"ДФ=д")); // 1
"ДФ=дд")); // 01
"ДФ=ддд")); // Сб
"ДФ=дддд")); // суббота
// час
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
"ДФ=ч")); // 8
"ДФ=чч")); // 08
"ДФ=Ч")); // 20
"ДФ=ЧЧ")); // 20
// минута
Сообщить(Формат(Дата, "ДФ=м")); // 1
Сообщить(Формат(Дата, "ДФ=мм")); // 01
// секунда
Сообщить(Формат(Дата, "ДФ=с")); // 3
Сообщить(Формат(Дата, "ДФ=сс")); // 03
/// Как задать локальный формат даты при выводе в 1с 8.3, 8.2
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
Сообщить(Формат(Дата,
"ДЛФ=Д")); // 01.01.2005
"ДЛФ=ДД")); // 1 января 2005 г.
"ДЛФ=В")); // 20:01:03
"ДЛФ=ДДВ")); // 1 января 2005 г. 20:01:03
"ДЛФ=ДВ")); // 01.01.2005 20:01:03
/// Как задать нулевое представление даты при выводе в 1с 8.3, 8.2
Сообщить(Формат('00010101000000', "ДП=""пустая дата""")); // пустая дата
/// Как задать представление значения типа Булево
/// при выводе в 1с 8.3, 8.2
Сообщить(Формат(Ложь, "БЛ=""врёшь!""")); // врёшь!
Сообщить(Формат(Истина, "БИ=""правду говоришь""")); // правду говоришь
/// Как задать представление периода при выводе в 1с 8.3, 8.2
Сообщить(
ПредставлениеПериода(
НачалоКвартала(ТекущаяДата()),
КонецКвартала(ТекущаяДата()),
"ФП=Истина")); // 3 кв. 2013 г., влияет, если 6 или 9 месяцев
/// Как задать число прописью при выводе в 1с 8.3, 8.2
Сообщить(
ЧислоПрописью(123.65)
); // Сто двадцать три 65
Сообщить(
ЧислоПрописью(
123.65,,
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2")
); // Сто двадцать три рубля 65 копеек
КонецПроцедуры
Чтение и запись XML
/// Как прочитать файл в формате XML через DOM
/// в 1с 8.3, 8.2
&НаСервере
Процедура ПрочитатьФайлXMLЧерезDOM(ПутьКФайлу)
// Разбор документа через DOM (document object model)
// https://ru.wikipedia.org/wiki/Document_Object_Model
// Разбираем файл test.xml, ссылка на его скачивание выше.
Парсер = Новый ЧтениеXML;
Парсер.ОткрытьФайл(ПутьКФайлу);
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Парсер);
Для Каждого Элемент0 Из Документ.ЭлементДокумента.ДочерниеУзлы Цикл
Если Элемент0.ИмяУзла = "Страна" Тогда
Страна = Элемент0;
Название =
Страна.Атрибуты.ПолучитьИменованныйЭлемент("Название");
Если Название <> Неопределено Тогда
Сообщить("== " + Название.Значение + " ==");
КонецЕсли;
Численность =
Страна.Атрибуты.ПолучитьИменованныйЭлемент("Численность");
Если Численность <> Неопределено Тогда
Сообщить("Численность: " + Численность.Значение);
КонецЕсли;
Столица = Страна.Атрибуты.ПолучитьИменованныйЭлемент("Столица");
Если Столица <> Неопределено Тогда
Сообщить("Столица: " + Столица.Значение);
КонецЕсли;
Для Каждого Элемент1 Из Страна.ДочерниеУзлы Цикл
Если Элемент1.ИмяУзла = "ТрадиционныеБлюда" Тогда
ТрадиционныеБлюда = Элемент1;
Сообщить("Традиционные блюда:");
Для Каждого Элемент2 Из ТрадиционныеБлюда.ДочерниеУзлы
Цикл
Если Элемент2.ИмяУзла = "Блюдо" Тогда
Блюдо = Элемент2;
Название =
Блюдо.Атрибуты.ПолучитьИменованныйЭлемент("Название");
Если Название <> Неопределено Тогда
Сообщить(" " + Название.Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ИначеЕсли Элемент1.ИмяУзла = "ОбщееОписание" Тогда
Сообщить("Общее описание:");
Сообщить(Элемент1.ТекстовоеСодержимое);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Парсер.Закрыть();
КонецПроцедуры
/// Как прочитать файл в формате XML последовательно
/// (способ 1) в 1с 8.3, 8.2
&НаСервере
Процедура ПрочитатьФайлXMLПоследовательноСпособ1(ПутьКФайлу)
// Этот способ подойдёт для очень больших файлов,
// для которых модель DOM неприменима.
// Способ 1.
// Разбираем файл test.xml, ссылка на его скачивание выше.
Парсер = Новый ЧтениеXML;
Парсер.ОткрытьФайл(ПутьКФайлу);
Пока Парсер.Прочитать() Цикл
Если
Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И
Парсер.Имя = "Страна"
Тогда
Название = Парсер.ЗначениеАтрибута("Название");
Если Название <> Неопределено Тогда
Сообщить("== " + Название + " ==");
КонецЕсли;
Численность = Парсер.ЗначениеАтрибута("Численность");
Если Численность <> Неопределено Тогда
Сообщить("Численность: " + Численность);
КонецЕсли;
Столица = Парсер.ЗначениеАтрибута("Столица");
Если Столица <> Неопределено Тогда
Сообщить("Столица: " + Столица);
КонецЕсли;
Пока Парсер.Прочитать() Цикл // <Страна>
Если
Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И
Парсер.Имя = "ТрадиционныеБлюда"
Тогда
Сообщить("Традиционные блюда:");
Пока Парсер.Прочитать() Цикл // <ТрадиционныеБлюда>
Если
Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И
Парсер.Имя = "Блюдо"
Тогда
Название = Парсер.ЗначениеАтрибута("Название");
Если Название <> Неопределено Тогда
Сообщить(" " + Название);
КонецЕсли;
ИначеЕсли
Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента И
Парсер.Имя = "ТрадиционныеБлюда"
Тогда
Прервать;
КонецЕсли;
КонецЦикла; // </ТрадиционныеБлюда>
ИначеЕсли
Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И
Парсер.Имя = "ОбщееОписание"
Тогда
Парсер.Прочитать();
Если Парсер.ТипУзла = ТипУзлаXML.Текст Тогда
Сообщить("Общее описание:");
Сообщить(Парсер.Значение);
КонецЕсли;
ИначеЕсли
Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента И
Парсер.Имя = "Страна"
Тогда
Прервать;
КонецЕсли;
КонецЦикла; // </Страна>
КонецЕсли;
КонецЦикла;
Парсер.Закрыть();
КонецПроцедуры
/// Как прочитать файл в формате XML последовательно
/// (способ 2) в 1с 8.3, 8.2
&НаСервере
Процедура ПрочитатьФайлXMLПоследовательноСпособ2(ПутьКФайлу)
// Этот способ подойдёт для очень больших файлов,
// для которых модель DOM неприменима.
// Способ 2.
// Разбираем файл test.xml, ссылка на его скачивание выше.
Парсер = Новый ЧтениеXML;
Парсер.ОткрытьФайл(ПутьКФайлу);
СтекИмен = Новый СписокЗначений;
Пока Парсер.Прочитать() Цикл
Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
СтекИмен.Добавить(Парсер.Имя);
ПолныйПуть = ПостроитьПуть(СтекИмен);
Если ПолныйПуть = "/Страны/Страна" Тогда
Название = Парсер.ЗначениеАтрибута("Название");
Если Название <> Неопределено Тогда
Сообщить("== " + Название + " ==");
КонецЕсли;
Численность = Парсер.ЗначениеАтрибута("Численность");
Если Численность <> Неопределено Тогда
Сообщить("Численность: " + Численность);
КонецЕсли;
Столица = Парсер.ЗначениеАтрибута("Столица");
Если Столица <> Неопределено Тогда
Сообщить("Столица: " + Столица);
КонецЕсли;
ИначеЕсли ПолныйПуть = "/Страны/Страна/ТрадиционныеБлюда" Тогда
Сообщить("Традиционные блюда:");
ИначеЕсли ПолныйПуть = "/Страны/Страна/ТрадиционныеБлюда/Блюдо"
Тогда
Название = Парсер.ЗначениеАтрибута("Название");
Если Название <> Неопределено Тогда
Сообщить(" " + Название);
КонецЕсли;
ИначеЕсли ПолныйПуть = "/Страны/Страна/ОбщееОписание" Тогда
Парсер.Прочитать();
Если Парсер.ТипУзла = ТипУзлаXML.Текст Тогда
Сообщить("Общее описание:");
Сообщить(Парсер.Значение);
КонецЕсли;
КонецЕсли;
ИначеЕсли Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
СтекИмен.Удалить(СтекИмен.Количество() - 1);
КонецЕсли;
КонецЦикла;
Парсер.Закрыть();
КонецПроцедуры
/// Как записать данные в файл формата XML в 1с 8.3, 8.2
&НаКлиенте
Процедура ЗаписатьДанныеВФорматеXML(ПутьКФайлуДляЗаписи)
// Предположим, что у нас есть данные о странах,
// которые нужно записать во внешний файл в формате XML.
Страны = СоздатьДанныеДляЗаписиВXML();
// И эти данные хранятся во списке значений Страны,
// который нам вернула внутренняя процедура (определена
// ниже).
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлуДляЗаписи);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Страны");
Для Каждого Страна Из Страны Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Страна");
ЗаписьXML.ЗаписатьАтрибут("Название", Страна.Значение.Название);
ЗаписьXML.ЗаписатьАтрибут("Численность",
Страна.Значение.Численность);
ЗаписьXML.ЗаписатьАтрибут("Столица", Страна.Значение.Столица);
ЗаписьXML.ЗаписатьНачалоЭлемента("ТрадиционныеБлюда");
Для Каждого Блюдо Из Страна.Значение.ТрадиционныеБлюда Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Блюдо");
ЗаписьXML.ЗаписатьАтрибут("Название", Блюдо.Значение.Название);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Блюдо
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // ТрадиционныеБлюда
ЗаписьXML.ЗаписатьНачалоЭлемента("ОбщееОписание");
ЗаписьXML.ЗаписатьТекст(Страна.Значение.ОбщееОписание);
ЗаписьXML.ЗаписатьКонецЭлемента(); // ОбщееОписание
ЗаписьXML.ЗаписатьКонецЭлемента(); // Страна
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Страны
ЗаписьXML.Закрыть();
КонецПроцедуры
&НаКлиенте
Функция СоздатьДанныеДляЗаписиВXML()
Страны = Новый СписокЗначений;
Россия = Новый Структура("Название, Численность, Столица,
ТрадиционныеБлюда, ОбщееОписание");
Россия.Название = "Россия";
Россия.Численность = "144000000";
Россия.Столица = "Москва";
Россия.ТрадиционныеБлюда = Новый СписокЗначений;
Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Щи"));
Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название",
"Солянка"));
Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название",
"Рассольник"));
Россия.ОбщееОписание = "Страна с очень" + Символы.ПС + "большой
территорией";
Страны.Добавить(Россия);
Китай = Новый Структура("Название, Численность, Столица,
ТрадиционныеБлюда, ОбщееОписание");
Китай.Название = "Китай";
Китай.Численность = "1357000000";
Китай.Столица = "Пекин";
Китай.ТрадиционныеБлюда = Новый СписокЗначений;
Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Свинина в
кисло-сладком соусе"));
Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Курица
гунбао"));
Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Мапо
тофу"));
Китай.ОбщееОписание = "Страна с очень" + Символы.ПС + "большим
населением.";
Страны.Добавить(Китай);
Возврат Страны;
КонецФункции
&НаСервере
Функция ПостроитьПуть(СтекИмен)
Путь = "";
Для Каждого Имя Из СтекИмен Цикл
Путь = Путь + "/" + Имя;
КонецЦикла;
Возврат Путь;
КонецФункции
Чтение и запись ZIP
&НаКлиенте
Процедура РаботаСZipАрхивами()
/// Как создать zip-архив из 1с 8.3, 8.2
НовыйАрхив = Новый ЗаписьZipФайла(
"c:\test.zip",
"", // пароль на архив (оставим пустой)
"Этот архив создан из 1с", // комментарий к архиву
МетодСжатияZIP.Сжатие, // сжатие или копирование
УровеньСжатияZIP.Оптимальный,
МетодШифрованияZIP.Zip20
);
/// Как добавить файл в zip-архив из 1с 8.3, 8.2
НовыйАрхив.Добавить(
"c:\readme.txt" // указываем полный путь к файлу
);
/// Как добавить группу файлов (по маске) в zip-архив
/// из 1с 8.3, 8.2
// Предположим, что в папке "c:\work" находятся файлы
// с расширением txt, добавим их все в архив.
НовыйАрхив.Добавить(
"c:\work\*.txt" // указываем маску к файлам
);
// А что если в "c:\work" находится другая папка, в которой
// в свою очередь тоже есть txt файлы. Чтобы обработать
// и эти файлы наш предыдущий пример следует изменить вот так:
НовыйАрхив.Добавить(
"c:\work\*.txt", // указываем маску к файлам
РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно
);
// Записываем созданный архив на диск компьютера.
НовыйАрхив.Записать();
/// Как открыть и добавить файл в уже существующий
/// zip-архив из 1с 8.3, 8.2
// К сожалению, библиотека языка не предоставляет нам такой возможности.
// Поэтому надо или сначала распаковать весь архив в локальную папку (об
этом ниже),
// далее добавить в эту папку нужный файл и, наконец, снова запаковать её
в архив.
// Но я рекомендую освоить консольный архиватор 7-zip (он предоставляет
// все возможности по модификации уже созданных архивов) и вызывать его
через
// команду ЗапуститьПриложение
/// Как распаковать zip-архив из 1с 8.3, 8.2
// Распакуем test.zip в папку "c:\zip_out"
Архив = Новый ЧтениеZipФайла(
"c:\test.zip", // путь к архиву
"" // пароль к архиву
);
// Сообщим комментарий к архиву.
Сообщить(Архив.Комментарий);
// Распакуем все файлы разом.
Архив.ИзвлечьВсе("c:\zip_out",
РежимВосстановленияПутейФайловZIP.Восстанавливать);
// Распакуем файлы по одиночке.
Для Каждого Элемент Из Архив.Элементы Цикл
Сообщить(Элемент.ПолноеИмя);
Архив.Извлечь(
Элемент, // элемент для извлечения
"c:\zip_out",
РежимВосстановленияПутейФайловZIP.Восстанавливать,
"" // пароль
);
КонецЦикла;
КонецПроцедуры
Работа с Word
/// Как создать документ Word на основе шаблона из 1с 8.3, 8.2
&НаКлиенте
Функция КакСоздатьДокументWordНаОсновеШаблона(ПутьКШаблону)
//
//
//
//
//
В шаблоне уже расставлены поля с определенными
именами, например, org_name, inn, kpp и т.д.
Наша задача - заполнить эти поля и сохранить
этот шаблон в виде вордовкского файла с
расширением docx;
// Сам шаблон мы создали по инструкции отсюда:
// helpme1c.ru/kak-sozdavat-shablony-word-dlya-ispolzovaniya-v-1s
// Или взяли готовым отсюда:
// helpme1c.ru/files/ref/bill.dotx
ПриложениеВорд = Новый COMОбъект("Word.Application");
ОбъектШаблон = ПриложениеВорд.Documents.Add(ПутьКШаблону);
Для Каждого Поле Из ОбъектШаблон.Fields Цикл
ПолноеИмяПоля = Поле.Code.Text;
//
//
//
//
Наши предопределенные поля имеют такой
вид: " MERGEFIELD org_name \* MERGEFORMAT".
Наша задача - вытащить из этой конструкции org_name
(ну или другое имя, которое мы задали в ворде).
Если (Найти(ПолноеИмяПоля, " MERGEFIELD") = 1) Тогда
ПозицияСлеша = Найти(ПолноеИмяПоля, "\*");
КороткоеИмяПоля = СокрЛП(Сред(ПолноеИмяПоля, 12, ПозицияСлеша 12));
ЗначениеПоля = "";
Если КороткоеИмяПоля = "id" Тогда
ЗначениеПоля = "1";
ИначеЕсли КороткоеИмяПоля = "bill_date" Тогда
ЗначениеПоля = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
ИначеЕсли КороткоеИмяПоля = "org_name" Тогда
ЗначениеПоля = "ООО ""Ромашка""";
ИначеЕсли КороткоеИмяПоля = "inn" Тогда
ЗначениеПоля = "1234567890";
ИначеЕсли КороткоеИмяПоля = "kpp" Тогда
ЗначениеПоля = "123456789";
Иначе
// ... и так все нужные поля
КонецЕсли;
Если ЗначениеПоля <> "" Тогда
Поле.Select();
ОбъектШаблон.Application.Selection.TypeText(ЗначениеПоля);
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Запишем файл в папку "Мои документы" пользователя
ФайлДляЗаписи = КаталогДокументов() + "\helpme1c_ru_word_test.docx";
// Если такой файл уже существует - удалим его.
УдалитьФайлы(ФайлДляЗаписи);
// Сохраняем шаблон как документ Word с расширением docx.
ОбъектШаблон.SaveAs(ФайлДляЗаписи);
// Не забываем закрыть приложение Word.
ОбъектШаблон.Application.Quit();
Возврат ФайлДляЗаписи;
КонецФункции
Как создавать шаблоны Word для использования в 1С
В этом уроке мы научимся создавать шаблоны Word с предопределенными именованными
полями, которые можно в дальнейшем заполнять программно из 1С (ссылка на пример кода).
Что это означает на практике?
К примеру, у нас есть типовая форма счёта на оплату, который мы выставляем покупателям.
Так вот - мы можем один раз создать шаблон такого счёта, прописать в нём поля id, date,
organization, inn, kpp... и т.д. и затем программным способом создавать готовые для отправки
покупателям счета на оплату.
Сейчас мы вместе в Word 2007 создадим такой шаблон, вернее я покажу сам принцип.
1. Первым делом создаём обычной документ Word.
2. Оформляем его как обычно.
3. Затем устанавливаем курсор в место, куда будет вставляться значение программно (пусть
это будет номер счёта):
4. Переходим на закладку "Вставка" и выбираем "Экспресс-блоки"-"Поле...":
5. В открывшемся диалоге выбираем тип поля "MergeField" и пишем имя поля (по которому
мы его будем находит в 1с программно) - "number":
6. Нажимаем "Ок" и в документ вставляется поля типа "MergeField" с именем "number":
Отлично! Это то что надо
7. Оформляем весь документ в этом же стиле (вставляя нужные поля):
И, наконец, сохраняем этот документ в виде шаблона Word (с расширением dotx):
Готово!
Полученный файл с расширением dotx используем для программного создания документов.
Чтение и запись DBF
/// Как прочитать записи файла в формате dbf из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПрочитатьЗаписиФайлаВФорматеDBFНаКлиенте(ПутьКФайлуDBF)
// О формате dbf - https://ru.wikipedia.org/wiki/DBF
Таблица = Новый XBase;
Таблица.ОткрытьФайл(
ПутьКФайлуDBF, // путь к базе
, // путь к индексу
Истина // только чтение
);
Сообщить("В таблице " + Таблица.КоличествоЗаписей() + " записей.");
Сообщить("Таблица имеет кодировку: " + Таблица.Кодировка);
Таблица.Первая(); // перешли к первой записи
Пока Не Таблица.ВКонце() Цикл
Если Не Таблица.ЗаписьУдалена() Тогда
Сообщить(
Строка(Таблица.EMPLOYEEID) + " " +
Таблица.LASTNAME + " " +
Таблица.TITLE + " " +
Таблица.ADDRESS
);
КонецЕсли;
Таблица.Следующая(); // переходим к следующей записи
КонецЦикла;
Таблица.ЗакрытьФайл();
КонецПроцедуры
/// Как найти нужную запись в файле в формате dbf из 1с 8.3, 8.2
&НаКлиенте
Процедура КакНайтиНужнуюЗаписьВФайлеВФорматеDBFНаКлиенте(ПутьКФайлуDBF)
// О формате dbf - https://ru.wikipedia.org/wiki/DBF
// Файлы dbf могут быть очень большими и содержать сотни
// тысяч записей. В этом случае полный перебор всех записей,
// чтобы найти одну - не очень хорошая идея.
Таблица = Новый XBase;
Таблица.ОткрытьФайл(
ПутьКФайлуDBF, // путь к базе
, // путь к индексу
Ложь // открываем на запись
);
//
//
//
//
Но для того, чтобы искать по ключу - нужен индексный файл,
включающий нужные нам поля. Если бы этот файл уже был у нас,
то мы бы передали его при открытии файла вышле, но у нас его
нет, а потому - займёмся его созданием.
// создадим индекс только по полю EMPLOYEEID
Таблица.Индексы.Добавить(
"INDEX_EMPLOYEEID", // имя индекса
"EMPLOYEEID", // выражение индекса
Истина // уникальность создаваемого индекса
);
КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
СоздатьКаталог(КаталогДляЭкспериментов);
ПутьКФайлуИндекса = КаталогДляЭкспериментов + "\test.cdx";
Таблица.СоздатьИндексныйФайл(ПутьКФайлуИндекса);
Таблица.ЗакрытьФайл();
// Заново открываем таблицу, уже на чтение и с индексным файлом,
// который мы только что создали.
Таблица = Новый XBase;
Таблица.ОткрытьФайл(
ПутьКФайлуDBF, // путь к базе
ПутьКФайлуИндекса, // путь к индексу
Истина // только чтение
);
// Найдём среди записей ту, у которой поле EMPLOYEEID равно 3.
// В таблице всего один индекс INDEX_EMPLOYEEID.
Таблица.ТекущийИндекс = Таблица.Индексы.Получить(0);
Таблица.Ключ.EMPLOYEEID = "3";
ЗаписьНайдена = Таблица.НайтиПоКлючу("=");
Если ЗаписьНайдена Тогда
Сообщить("Запись найдена");
Сообщить(
Строка(Таблица.EMPLOYEEID) + " " +
Таблица.LASTNAME + " " +
Таблица.TITLE + " " +
Таблица.ADDRESS
);
Иначе
Сообщить("Запись не найдена");
КонецЕсли;
Таблица.ЗакрытьФайл();
КонецПроцедуры
/// Как добавить новые записи в уже существующий файл в
/// формате dbf из 1с 8.3, 8.2
&НаКлиенте
Процедура КакДобавитьНовыеЗаписиВФайлВФорматеDBFНаКлиенте(ПутьКФайлуDBF)
// О формате dbf - https://ru.wikipedia.org/wiki/DBF
// Добавим в уже знакомый нам test.dbf 2 новые записи о работниках.
Таблица = Новый XBase;
Таблица.ОткрытьФайл(
ПутьКФайлуDBF, // путь к базе
, // путь к индексу
Ложь // открываем на запись
);
Таблица.Добавить();
Таблица.EMPLOYEEID = "100";
Таблица.LASTNAME = "Милькин";
Таблица.TITLE = "Программист";
Таблица.ADDRESS = "Владивосток";
Таблица.Записать();
Таблица.Добавить();
Таблица.EMPLOYEEID = "101";
Таблица.LASTNAME = "Милькина";
Таблица.TITLE = "Биолог";
Таблица.ADDRESS = "Владивосток";
Таблица.Записать();
Таблица.ЗакрытьФайл();
КонецПроцедуры
/// Как удалить определенные записи в файле в формате dbf из 1с 8.3, 8.2
&НаКлиенте
Процедура
КакУдалитьОпределенныеЗаписиИзФайлаВФорматеDBFНаКлиенте(ПутьКФайлуDBF)
// О формате dbf - https://ru.wikipedia.org/wiki/DBF
// Удалим записи с LASTNAME Милькин и Милькина
Таблица = Новый XBase;
Таблица.ОткрытьФайл(
ПутьКФайлуDBF, // путь к базе
, // путь к индексу
Ложь // открываем на запись
);
Таблица.Первая();
Пока Не Таблица.ВКонце() Цикл
Если
СокрЛП(Таблица.LASTNAME) = "Милькин" Или
СокрЛП(Таблица.LASTNAME) = "Милькина"
Тогда
Таблица.Удалить();
КонецЕсли;
Таблица.Следующая();
КонецЦикла;
// Но Удалить() только ставит пометку на
// удаление, а чтобы реально удалить помеченные
// на удаление записи нужно вызвать метод Сжать().
Таблица.Сжать();
Таблица.ЗакрытьФайл();
КонецПроцедуры
/// Как создать файл в формате dbf с нужными
/// полями из 1с 8.3, 8.2
&НаКлиенте
Процедура КакСоздатьФайлВФорматеDBFНаКлиенте()
// О формате dbf - https://ru.wikipedia.org/wiki/DBF
НоваяТаблица = Новый XBase;
НоваяТаблица.Кодировка = КодировкаXBase.ANSI;
// Описываем колонки таблицы.
НоваяТаблица.Поля.Добавить(
"FIRSTNAME", // имя колонки
"S", // тип
100, // длина
);
НоваяТаблица.Поля.Добавить(
"AGE",
"N",
10,
0 // точность
) ;
// Типы ещё бывают:
// N - число
// S - строка
// D - дата
// L - булево
// F - число
КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
СоздатьКаталог(КаталогДляЭкспериментов);
ПутьКНовомуDBF = КаталогДляЭкспериментов + "\new.dbf";
НоваяТаблица.СоздатьФайл(
ПутьКНовомуDBF, // путь к базе
// путь к индексу
);
НоваяТаблица.ЗакрытьФайл();
Сообщить("Новый файл создан в '" + ПутьКНовомуDBF + "'.");
// И уже теперь можем его открыть и добавить данные.
Таблица = Новый XBase;
Таблица.ОткрытьФайл(
ПутьКНовомуDBF, // путь к базе
, // путь к индексу
Ложь // открываем на запись
);
Таблица.Добавить();
Таблица.FIRSTNAME = "Вова";
Таблица.AGE = 31;
Таблица.Записать();
Таблица.Добавить();
Таблица.FIRSTNAME = "Алёна";
Таблица.AGE = 24;
Таблица.Записать();
Таблица.ЗакрытьФайл();
КонецПроцедуры
Работа с http-запросами (get и post)
/// Как получить страницу сайта через http-запрос
/// из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьСтраницуСайтаЧерезHttpЗапросНаКлиенте()
// В сети есть сайт http://example.com
// Запросим содержимое его главной страницы.
// Подключаемся к сайту.
Соединение = Новый HTTPСоединение(
"example.com", // сервер (хост)
80, // порт, по умолчанию для http используется 80, для https 443
, // пользователь для доступа к серверу (если он есть)
, // пароль для доступа к серверу (если он есть)
, // здесь указывается прокси, если он есть
, // таймаут в секундах, 0 или пусто - не устанавливать
// защищенное соединение, если используется https
);
// Получаем текст корневой страницы через GET-запрос.
Запрос = Новый HTTPЗапрос("/");
// Если бы нужна была другая страница, мы бы указали,
// например, "/about" или "/news".
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код: " + Результат.КодСостояния);
// Что примерно означают коды результата запроса:
// [100, 299] - хороший код возврата
// [300, 399] - нас перенаправляют на другую страницу,
//
причём 302 - код постоянного перенаправления
// [400, 499] - ошибка запроса
// [500, 599] - ошибка сервера
// в теле результата запроса - текст обычной html страницы
Сообщить("Тело результата: " + Результат.ПолучитьТелоКакСтроку());
КонецПроцедуры
/// Как обработать перенаправление в http-запросе
/// из 1с 8.3, 8.2
&НаКлиенте
Процедура КакОбработатьПеренаправлениеВHttpЗапросеНаКлиенте()
// Предположим, что мы хотим отправить поисковый http запрос
// гуглу и получить от него страницу с результатами нашего
// запроса.
// К примеру, будем искать по строке "работа программистом 1с в моём
городе".
Соединение = Новый HTTPСоединение("www.google.com", 80);
Запрос = Новый HTTPЗапрос("/search?q=работа программистом 1с в моём
городе");
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код " + Результат.КодСостояния);
Если Результат.КодСостояния = 302 Тогда
Сообщить("Нас перенаправили на другую страницу.");
Сообщить("Адрес этой страницы находится в заголовке результата
Location.");
Сообщить("Вот он: " + Результат.Заголовки.Получить("Location"));
// Воспользуемся вспомогательной функцией СтруктураURI, которая
// сама вытаскивает из адреса имя хоста, порт и путь к ресурсу.
URI = СтруктураURI(Результат.Заголовки.Получить("Location"));
// Делаем новое подключение и get запрос.
Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт);
Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код " + Результат.КодСостояния);
// Сохраним тело ответа (это и есть наша страница с результатами
// поиска) в виде htm файла и тут же покажем его пользователю.
КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
СоздатьКаталог(КаталогДляЭкспериментов);
ФайлРезультатов = КаталогДляЭкспериментов + "\test.htm";
Текст = Новый ЗаписьТекста(ФайлРезультатов, КодировкаТекста.UTF8);
Текст.Записать(Результат.ПолучитьТелоКакСтроку());
Текст.Закрыть();
Сообщить("Результаты поиска сохранены в " + ФайлРезультатов);
ЗапуститьПриложение(ФайлРезультатов);
КонецЕсли;
КонецПроцедуры
/// Как сохранить картинку с сайта через http-запрос
/// из 1с 8.3, 8.2
&НаКлиенте
Процедура КакСохранитьКартинкуСайтаЧерезHttpЗапросНаКлиенте()
// Запрашивать через http можно не только html-страницы,
// но и другие объекты, доступные нам через http,
// например, картинки.
//
//
//
//
Сохраним на диск и покажем пользователю картинку, которая
размещена в интернете по адресу:
thumb7.shutterstock.com/display_pic_with_logo/1014806/270790184/
stock-photo-summer-holidays-background-sea-background-270790184.jpg
Соединение = Новый HTTPСоединение("thumb7.shutterstock.com", 80);
// Get-запрос к ресурсу на сервере.
Запрос = Новый HTTPЗапрос("/display_pic_with_logo/1014806/270790184/" +
"stock-photo-summer-holidays-background-sea-background270790184.jpg");
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код " + Результат.КодСостояния);
// Сама картинка - уже в теле ответа, осталось
// только записать её в файл на диск в виде двоичных данных.
КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
СоздатьКаталог(КаталогДляЭкспериментов);
ФайлКартинки = КаталогДляЭкспериментов + "\test.jpg";
// Записываем картинку на диск.
Результат.ПолучитьТелоКакДвоичныеДанные().Записать(ФайлКартинки);
Сообщить("Сохранили картинку по адресу " + ФайлКартинки);
// Покажем картинку пользователю.
ЗапуститьПриложение(ФайлКартинки);
КонецПроцедуры
/// Как послать защищенный https запрос к серверу из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПослатьЗащищенныйHttpsЗапросКСерверуНаКлиенте()
//
//
//
//
Получим код страницы https://ya.ru
Так как для доступа к ней используется защищенный
протокол https - нам нужно заполнить последний
параметр при соединении с сервером.
Соединение = Новый HTTPСоединение(
"ya.ru", // сервер (хост)
443, // порт, по умолчанию для http используется 80, для https 443
, // пользователь для доступа к серверу (если он есть)
, // пароль для доступа к серверу (если он есть)
, // здесь указывается прокси, если он есть
, // таймаут в секундах, 0 или пусто - не устанавливать
Новый ЗащищенноеСоединениеOpenSSL()
);
// Получаем текст корневой страницы через GET-запрос.
Запрос = Новый HTTPЗапрос("/");
// Если бы нужна была другая страница, мы бы указали,
// например, "/about" или "/news".
Результат = Соединение.Получить(Запрос);
Сообщить(Результат.КодСостояния);
Сообщить(Результат.ПолучитьТелоКакСтроку());
КонецПроцедуры
/// Как установить заголовки http-запроса из 1с 8.3, 8.2
&НаКлиенте
Процедура КакУстановитьЗаголовкиHttpЗапросаНаКлиенте()
// Возьмём чисто гипотетический пример.
//
//
//
//
//
Нам нужно послать запрос к http://example.com/,
передав ему в куках (cookie) session=231.
Также мы будем передадим в запросе поле keep-alive,
чтобы сервер не закрывал наше соединений к нему
для повторых запросов.
// За всё это отвечают заголовки запроса.
Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", "session=231");
Заголовки.Вставить("Connection", "keep-alive");
// Подключаемся к сайту.
Соединение = Новый HTTPСоединение("example.com");
// Получаем текст корневой страницы через GET-запрос.
Запрос = Новый HTTPЗапрос("/", Заголовки);
// Если бы нужна была другая страница, мы бы указали,
// например, "/about" или "/news".
Результат = Соединение.Получить(Запрос);
КонецПроцедуры
/// Как указать прокси для http-запроса из 1с 8.3, 8.2
&НаКлиенте
Процедура КакУказатьПроксиДляHttpЗапросаНаКлиенте()
// Если для соединения с интернетом используется прокси,
// его нужно указывать так.
ПроксиСервер = Новый ИнтернетПрокси;
// авторизация
ПроксиСервер.Пользователь = "Vova";
ПроксиСервер.Пароль = "123";
// прокси сервер прописывается для каждого протокола отдельно
ПроксиСервер.Установить("http", "192.168.0.1", "8080");
ПроксиСервер.Установить("https", "192.168.0.1", "6547");
// Созданный объект указываем при http соединении.
Соединение = Новый HTTPСоединение("example.com",,,, ПроксиСервер);
КонецПроцедуры
/// Как послать post-запрос через http из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПослатьPostЗапросНаКлиенте()
// Post-запрос отличается от Get-запроса только наличием
// тела запроса.
//
//
//
//
То есть этот тот же самый HTTPЗапрос, но у которого
вызыван метод УстановитьТелоИзСтроки.
И это тело уже может быть и просто текстом, и текстом
в формате xml, json, soap и так далее.
// В качестве большого примера рассмотрим фрагмент
// авторизации на сайте 1с, там используются и get
// и post запросы.
// Откуда мы узнали как и когда посылать какие запросы?
// Мы подсмотрели их у браузера (в Хроме нажмите F12, вкладка Network),
// а также использовали беплатный инструмент Fiddler
// для отладки и мониторинга http запросов.
//
//
//
//
Если бы мы писали рабочий код - нам понадобилось
всего несколько соединений с сервером, которые
мы бы не закрывали. Но в учебных целях будем
писать максимально просто ("тупо").
// 1. Первым делом - посылаем get-запрос к
// https://releases.1c.ru/total
Соединение = Новый HTTPСоединение("releases.1c.ru",,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/total");
Результат = Соединение.Получить(Запрос);
// В куках нам должны вернуть идентификатор сессии.
Куки = Результат.Заголовки.Получить("Set-Cookie");
// Он идёт первым параметром и отделён от остальных
// частей точкой с запятой.
Куки = СтрЗаменить(Куки, ";", Символы.ПС);
ИдентификаторСессии1 = СтрПолучитьСтроку(Куки, 1);
Сообщить(ИдентификаторСессии1);
// 2. В результате первого запроса нас перенаправили
// на другую страницу, перейдём на неё новым get-запросом.
Перенаправление = Результат.Заголовки.Получить("Location");
Сообщить("Код возврата " + Результат.КодСостояния);
Сообщить("Нас перенаправили на " + Перенаправление);
// При помощи служебной функции СтруктураURI разберём
// новый адрес на части.
URI = СтруктураURI(Перенаправление);
Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);
Результат = Соединение.Получить(Запрос);
// В куках нам вернули второй идентификатор.
Куки = Результат.Заголовки.Получить("Set-Cookie");
Куки = СтрЗаменить(Куки, ";", Символы.ПС);
ИдентификаторСессии2 = СтрПолучитьСтроку(Куки, 1);
Сообщить(ИдентификаторСессии2);
//
//
//
//
3. В результате предыдущего Get-запроса в теле нам вернули
страницу авторизации, вытащим из формы авторизации значения
параметров name="lt", name="execution" и name="_eventId",
чтобы затем сформировать код приглашения на сайт.
ltValue = "";
executionValue = "";
_eventIdValue = "";
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(Результат.ПолучитьТелоКакСтроку());
Для Индекс = 0 По Текст.КоличествоСтрок() Цикл
Строка = Текст.ПолучитьСТроку(Индекс);
Если Найти(Строка, "name=""lt""") > 0 Тогда
ltValue = ВытащитьЗначениеИзСтроки(Строка);
ИначеЕсли Найти(Строка, "name=""execution""") > 0 Тогда
executionValue = ВытащитьЗначениеИзСтроки(Строка);
ИначеЕсли Найти(Строка, "name=""_eventId""") > 0 Тогда
_eventIdValue = ВытащитьЗначениеИзСтроки(Строка);
КонецЕсли;
КонецЦикла;
Сообщить(ltValue);
Сообщить(executionValue);
Сообщить(_eventIdValue);
// Для формирования кода приглашения нам понадобится
// наш логин и пароль от ИТС.
ЛогинИТС = "";
ПарольИТС = "";
Если ЛогинИТС = "" Или ПарольИТС = "" Тогда
Сообщить("Для продолжения укажите в коде логин и пароль от ИТС.");
Возврат;
КонецЕсли;
КодПриглашения = "inviteCode=" +
"&lt=" + ltValue +
"&execution=" + executionValue +
"&_eventId=" + _eventIdValue +
"&username=" + ЛогинИТС +
"&password=" + ПарольИТС;
// 4. Наконец, посылаем Post-запрос, вкладывая в тело запроса
// код приглашения, а куках указыаем второй идентификатор сессии.
Ресурс =
"/login;" +
ИдентификаторСессии2 +
"?service=https%3A%2F%2Fusers.v8.1c.ru%2Fdistribution%2Fpublic%2Fsecurity_che
ck%3B" +
ИдентификаторСессии1;
Соединение = Новый HTTPСоединение("login.1c.ru",,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", ИдентификаторСессии2);
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
Запрос.УстановитьТелоИзСтроки(КодПриглашения);
Результат = Соединение.ОтправитьДляОбработки(Запрос);
Сообщить("Нам вернули код " + Результат.КодСостояния);
Перенаправление = Результат.Заголовки.Получить("Location");
Сообщить("И перенаправили на " + Перенаправление);
// 5. В завершении авторизации переходим на следующую
// страницу, используя первый идентификатор сессии.
URI = СтруктураURI(Перенаправление);
Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", ИдентификаторСессии1);
Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере, Заголовки);
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули " + Результат.КодСостояния);
Перенаправление = Результат.Заголовки.Получить("Location");
Сообщить("И окончательно перенаправили на " + Перенаправление);
// Авторизация окончена, теперь можем запрашивать любые
// страницы сайта, используя первый идентификатор сессии.
КонецПроцедуры
&НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт
СтрокаURI = СокрЛП(СтрокаURI);
// схема
Схема = "";
Позиция = Найти(СтрокаURI, "://");
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция - 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;
// строка соединения и путь на сервере
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = "";
Позиция = Найти(СтрокаСоединения, "/");
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
КонецЕсли;
// информация пользователя и имя сервера
СтрокаАвторизации = "";
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, "@");
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;
// логин и пароль
Логин = СтрокаАвторизации;
Пароль = "";
Позиция = Найти(СтрокаАвторизации, ":");
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция - 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;
// хост и порт
Хост = ИмяСервера;
Порт = "";
Позиция = Найти(ИмяСервера, ":");
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция - 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("Схема", Схема);
Результат.Вставить("Логин", Логин);
Результат.Вставить("Пароль", Пароль);
Результат.Вставить("ИмяСервера", ИмяСервера);
Результат.Вставить("Хост", Хост);
Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
Возврат Результат;
КонецФункции
&НаКлиенте
Функция ВытащитьЗначениеИзСтроки(Строка)
Позиция2 = СтрДлина(Строка);
Пока Позиция2 > 1 Цикл
Если Сред(Строка, Позиция2, 1) = """" Тогда
Прервать;
КонецЕсли;
Позиция2 = Позиция2 - 1;
КонецЦикла;
Позиция1 = Позиция2 - 1;
Пока Позиция1 > 1 Цикл
Если Сред(Строка, Позиция1, 1) = """" Тогда
Прервать;
КонецЕсли;
Позиция1 = Позиция1 - 1;
КонецЦикла;
Возврат Сред(Строка, Позиция1 + 1, Позиция2 - Позиция1 - 1);
КонецФункции
Работа с ftp
/// Как подлючиться к FTP серверу из 1с 8.3, 8.2
&НаКлиенте
Функция ПодключитьсяКFTPСерверу()
Соединение = Новый FTPСоединение(
"0.0.0.0", // адрес ftp сервера
21, // порт сервера
"user", // имя пользователя
"123", // пароль пользователя
Неопределено, // прокси не используется
Истина, // пассивный режим работы
0, // таймаут (0 - без ограничений)
Неопределено // незащищенное соединение
);
// Для случаев, когда у ftp сервера нет возможности
// обращаться к нам (мы находимся за межсетевым экраном)
// следует использовать пассивный режим работы.
Возврат Соединение;
КонецФункции
/// Как искать файлы по FTP из 1с 8.3, 8.2
&НаКлиенте
Процедура ПоискФайловПоFTP(Команда)
// Функция подключения определена выше.
Соединение = ПодключитьсяКFTPСерверу();
// Установим текущий каталог.
Соединение.УстановитьТекущийКаталог("/");
// Найдём конкретный файл по его полному адресу.
// Внимание! Используем прямые слеши.
НайденныеФайлы = Соединение.НайтиФайлы("/data/1.txt");
Если НайденныеФайлы.Количество() > 0 Тогда
Файл = НайденныеФайлы[0];
// и получим следующую информацию о нём:
Сообщить("Имя: " + Файл.ПолноеИмя);
Сообщить("Это файл: " + Файл.ЭтоФайл());
Сообщить("Это каталог: " + Файл.ЭтоКаталог());
Сообщить("Размер: " + Файл.Размер() + " байт");
Сообщить("Атрибут только чтение: " + Файл.ПолучитьТолькоЧтение());
Сообщить("Атрибут скрытый: " + Файл.ПолучитьНевидимость());
Сообщить("Атрибут время изменения: " +
Файл.ПолучитьВремяИзменения());
КонецЕсли;
// Найдём все папки и файлы в корневом каталоге
НайденныеФайлы = Соединение.НайтиФайлы(
"/", // ищём в корневом каталоге
"*" // любые файлы (здесь можно задать маску)
);
Для Каждого Файл Из НайденныеФайлы Цикл
Сообщить(Файл.ПолноеИмя);
КонецЦикла;
// Найдём все файлы с расширением .txt в папке data
НайденныеФайлы = Соединение.НайтиФайлы(
"/data", // ищём в определенной папке
"*.txt" // по определенной маске
);
КонецПроцедуры
/// Как скачивать файлы по FTP из 1с 8.3, 8.2
&НаКлиенте
Процедура ПолучениеФайловПоFTP(Команда)
// Функция подключения определена выше.
Соединение = ПодключитьсяКFTPСерверу();
// Установим текущий каталог.
Соединение.УстановитьТекущийКаталог("/");
ПапкаДляСохранения = СлужебныйНаКлиенте.СоздатьПапкуДляЭкспериментов();
// Скачаем "trade_exchange/01.01.2017.xml"
// Внимание! Используем прямые слеши.
Соединение.Получить(
"trade_exchange/01.01.2017.xml", // что качаем
ПапкаДляСохранения + "/01.01.2017.xml" // куда качаем
);
Сообщить("Сохранили файл в " + ПапкаДляСохранения);
КонецПроцедуры
/// Как передавать файлы по FTP из 1с 8.3, 8.2
&НаКлиенте
Процедура ПередачаФайловПоFTP(Команда)
// Функция подключения определена выше.
Соединение = ПодключитьсяКFTPСерверу();
// Установим текущий каталог.
Соединение.УстановитьТекущийКаталог("/");
// Создадим случайный текстовый файл.
Папка = СлужебныйНаКлиенте.СоздатьПапкуДляЭкспериментов();
Служебный.СоздатьПроизвольныйТекстовыйФайл(
Папка + "/info.txt");
// Запишем этот файл на сервер по ftp в папку trade_exchange
// Внимание! Используем прямые слеши.
Соединение.Записать(
Папка + "/info.txt", // что записываем
"/trade_exchange/info.txt" // куда записываем
);
Сообщить("Передали файл по FTP.");
КонецПроцедуры
&НаКлиенте
Процедура ДругиеОперацииПоFTP(Команда)
// Функция подключения определена выше.
Соединение = ПодключитьсяКFTPСерверу();
// Установим текущий каталог.
Соединение.УстановитьТекущийКаталог("/");
/// Как создать новый каталог по FTP из 1с 8.3, 8.2
Соединение.СоздатьКаталог("/NewBin");
/// Как удалить каталог по FTP вместе с содержимым из 1с 8.3, 8.2
Соединение.Удалить("/trade_exchange");
/// Как удалить файлы по FTP из 1с 8.3, 8.2
Соединение.Удалить(
"/trade_exchange/01.01.2017.xml"
); // удаляем один файл по его адресу
Соединение.Удалить(
"/trade_exchange", // путь к удаляемым файлам
"*.xml" // маска для выбора
); // или несколько файлов поиском по маске
/// Как переименовать файл или каталог по FTP из 1с 8.3, 8.2
Соединение.Переместить(
"/NewBin", // старое имя
"/OldBin" // новое имя
);
КонецПроцедуры
Работа с текстовым документом
/// Как записать текстовый файл в 1с 8.3, 8.2
&НаКлиенте
Процедура КакЗаписатьТекстовыйФайл(Команда)
КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
СоздатьКаталог(КаталогДляЭкспериментов);
ТекстовыйФайл = Новый ТекстовыйДокумент;
// Устанавливаем содержимое файла.
ТекстовыйФайл.УстановитьТекст("
|Как прекрасен
|этот мир!");
// Очищаем содержимое файла.
ТекстовыйФайл.Очистить();
// Добавляем первую ...
ТекстовыйФайл.ДобавитьСтроку("Первая строчка файла");
// ... и вторую строчку файла.
ТекстовыйФайл.ДобавитьСтроку("Вторая строчка файла");
// Меняем первую строчку на "Привет"
ТекстовыйФайл.ЗаменитьСтроку(
1, // номер строки в файле, нумеруется с 1
"Привет"
);
// Вставляем новую строчку сразу после первой,
// то есть на место второй.
ТекстовыйФайл.ВставитьСтроку(
2, // номер строки, на место которой вставляем новую
"Владимир"
);
// Удаляем вторую строчку ("Владимир")
ТекстовыйФайл.УдалитьСтроку(2);
// Записываем файл на диск.
// Если такой файл уже существует - он будет перезаписан.
ТекстовыйФайл.Записать(
КаталогДляЭкспериментов + "\out.txt", // путь для сохранения
КодировкаТекста.UTF8, // кодировка
Символы.ВК + Символы.ПС // разделитель строк
);
// Открываем созданный файл в блокноте.
ЗапуститьПриложение(КаталогДляЭкспериментов + "\out.txt");
КонецПроцедуры
/// Как прочитать текстовый файл в 1с 8.3, 8.2
&НаКлиенте
Процедура КакПрочитатьТекстовыйФайл(Команда)
ОчиститьСообщения();
КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
СоздатьКаталог(КаталогДляЭкспериментов);
ПутьКФайлу = КаталогДляЭкспериментов + "\in.txt";
// Создаем случайный текстовый файл.
Служебный.СоздатьПроизвольныйТекстовыйФайл(ПутьКФайлу);
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.Прочитать(
ПутьКФайлу,
// Если не указать кодировку напрямую, то она
// по возможности определится автоматически.
КодировкаТекста.UTF8,
// К этом значению будут приведены разделители
// строк из файла. Если ничего не указывать // останутся родные.
Символы.ВК + Символы.ПС
);
// Выводим весь текст целиком.
Сообщить(ТекстовыйФайл.ПолучитьТекст());
// Выводим текст по строкам.
Для Индекс = 1 По ТекстовыйФайл.КоличествоСтрок() Цикл
Сообщить(ТекстовыйФайл.ПолучитьСтроку(Индекс));
КонецЦикла;
КонецПроцедуры
/// Как использовать текстовый макет для формирования
/// печатной формы в 1с 8.3, 8.2
&НаКлиенте
Процедура КакВывестиТекстовыйМакетПростейший(Команда)
ОчиститьСообщения();
// Рассмотрим простейший случай.
//
//
//
//
Нам требуется сделать печатную форму, в которой
в шапке будет выводиться номер и дата документа,
а в табличной части: список и количество,
заказанных товаров.
// Вызываем функцию, которая сформирует на сервере
// печатную форму и вернёт её обратно на клиент.
ПечатнаяФорма = СформироватьПростейшуюПечатнуюФорму();
// Выводим её пользователю, а он уже отправит её на печать.
ПечатнаяФорма.Показать("Заказ №1");
КонецПроцедуры
&НаСервере
Функция СформироватьПростейшуюПечатнуюФорму()
// Если никаких особых требований к оформлению такой
// формы нет - милое (и главное очень быстрое) дело
// сделать её через текстовый макет.
//
//
//
//
О том, как создать текстовый макет - читайте по адресу
helpme1c.ru/kak-sozdavat-tekstovyj-maket-v-1s
В нашем случае такой макет я уже создал и добавил
в эту обработку под именем "ПростейшийТекстовыйМакет"
ПечатнаяФорма = Новый ТекстовыйДокумент;
Макет = Обработки.ОбработкаДляИспытаний.ПолучитьМакет(
"ПростейшийТекстовыйМакет");
// Получаем область и макета по имени.
Шапка = Макет.ПолучитьОбласть("Шапка");
// Заполняем её параметры.
Шапка.Параметры.Дата = ТекущаяДата();
Шапка.Параметры.Номер = 1;
// Выводим её в документ.
ПечатнаяФорма.Вывести(Шапка);
// Заголовок табличной части.
ТабличнаяЧастьЗаголовок =
Макет.ПолучитьОбласть("ТабличнаяЧастьЗаголовок");
ПечатнаяФорма.Вывести(ТабличнаяЧастьЗаголовок);
// Обычно в цикле выводятся строки табличной части.
ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьСтрока");
// Строка 1
ТабличнаяЧастьСтрока.Параметры.Номенклатура = "Банан";
ТабличнаяЧастьСтрока.Параметры.Количество = 10;
ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
// Строка 2
ТабличнаяЧастьСтрока.Параметры.Номенклатура = "Помидор";
ТабличнаяЧастьСтрока.Параметры.Количество = 5;
ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
// Завершаем табличную часть подвалом.
ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьПодвал");
ТабличнаяЧастьСтрока.Параметры.ИтогоКоличество = 15;
ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
// Возвращаем печатную форму обратно на клиент.
Возврат ПечатнаяФорма;
КонецФункции
/// Как использовать параметры полей при оформлении
/// текстового макета в 1с 8.3, 8.2
&НаКлиенте
Процедура КакВывестиТекстовыйМакетПоСложнее(Команда)
ОчиститьСообщения();
// Рассмотрим тот же случай, что и выше.
//
//
//
//
Нам требуется сделать печатную форму, в которой
в шапке будет выводиться номер и дата документа,
а в табличной части: список и количество,
заказанных товаров.
// Вызываем функцию, которая сформирует на сервере
// печатную форму и вернёт её обратно на клиент.
ПечатнаяФорма = СформироватьПечатнуюФормуПосложнее();
// Выводим её пользователю, а он уже отправит её на печать.
ПечатнаяФорма.Показать("Заказ №2");
КонецПроцедуры
&НаСервере
Функция СформироватьПечатнуюФормуПосложнее()
// Если никаких особых требований к оформлению такой
// формы нет - милое (и главное очень быстрое) дело
// сделать её через текстовый макет.
//
//
//
//
О том, как создать текстовый макет - читайте по адресу
helpme1c.ru/kak-sozdavat-tekstovyj-maket-v-1s
В нашем случае такой макет я уже создал и добавил
в эту обработку под именем "ТекстовыйМакетПосложнее"
// Обратите внимание - этот текстовый макет уже содержит
// форматирование отдельных полей.
//
//
//
//
//
К примеру, мы задали свой формат для поле Дата;
указали, что если поле Номенклатура не помещается
на одной строке - нужно переносить его на следующие;
задали размер дробной части (2) для поля Количество;
переопределили выравнивание поля Номенклатура и т.д.
ПечатнаяФорма = Новый ТекстовыйДокумент;
Макет = Обработки.ОбработкаДляИспытаний.ПолучитьМакет(
"ТекстовыйМакетПосложнее");
// Получаем область и макета по имени.
Шапка = Макет.ПолучитьОбласть("Шапка");
// Заполняем её параметры.
Шапка.Параметры.Дата = ТекущаяДата();
Шапка.Параметры.Номер = 2;
// Выводим её в документ.
ПечатнаяФорма.Вывести(Шапка);
// Заголовок табличной части.
ТабличнаяЧастьЗаголовок =
Макет.ПолучитьОбласть("ТабличнаяЧастьЗаголовок");
ПечатнаяФорма.Вывести(ТабличнаяЧастьЗаголовок);
// Обычно в цикле выводятся строки табличной части.
ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьСтрока");
// Строка 1
ТабличнаяЧастьСтрока.Параметры.Номенклатура =
"Очень очень длинное название товара, много строк.";
ТабличнаяЧастьСтрока.Параметры.Количество = 100.234234;
ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
// Строка 2
ТабличнаяЧастьСтрока.Параметры.Номенклатура =
"Короткое название товара, одна строка.";
ТабличнаяЧастьСтрока.Параметры.Количество = 30.56757;
ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
// Завершаем табличную часть подвалом.
ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьПодвал");
ТабличнаяЧастьСтрока.Параметры.ИтогоКоличество = 130.801804;
ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
// Возвращаем печатную форму обратно на клиент.
Возврат ПечатнаяФорма;
КонецФункции
&НаКлиенте
Процедура ФормируемПечатнуюФормуИзТабличногоМакета(Команда)
//
//
//
//
В макетах обработки у нас определен макет с именем
ТабличныйМакет и типом ТабличныйДокумент.
Вот как создаются такие макеты:
helpme1c.ru/kak-sozdat-tablichnyj-maket-v-1s
// Сформируем печатную форму на основе этого макета.
// Важно понимать, что сама печатная форма - это тоже
// табличный документ, просто составленный из кусочков других
// документов (макетов).
// Печатная форма формируется на сервере, а затем
// возвращается обратно на клиент...
ПечатнаяФорма = СформироватьПечатнуюФормуИзТабличногоДокумента();
НастроитьКолонтитулы(ПечатнаяФорма);
НастроитьПараметрыПечати(ПечатнаяФорма);
// ... чтобы вывести её пользователю в виде отдельного окна
ПечатнаяФорма.Показать(
"Наш отчёт" // заголовок окна с отчётом
);
// после показа пользователь может сам и распечатать
// и сохранить эту форму, но ...
// .. мы можем программно сами сохранить форму в файл в нужном формате
//ПечатнаяФорма.Записать(
//
СлужебныйНаКлиенте.СоздатьПапкуДляЭкспериментов() + "\Наш
отчёт.xls",
//
ТипФайлаТабличногоДокумента.XLS
//);
// .. или сразу отправить её на принтер
//ПечатнаяФорма.Напечатать(
//
РежимИспользованияДиалогаПечати.НеИспользовать);
КонецПроцедуры
/// Как сформировать печатную форму из табличного документа в 1с 8.3, 8.2
&НаСервере
Функция СформироватьПечатнуюФормуИзТабличногоДокумента()
// Получаем макет, сохраненный в нашей обработке.
Макет = Обработки.ОбработкаДляИспытаний.ПолучитьМакет("ТабличныйМакет");
// Вот так можно изменить табличный макет программно,
// уже после его создания.
МеняемТабличныйДокументПрограммно(Макет);
ПечатнаяФорма = Новый ТабличныйДокумент;
// # Шапка документа #
// Получаем область "Шапка" из макета.
Шапка = Макет.ПолучитьОбласть("Шапка");
// Заполняем её параметры.
Шапка.Параметры.Номер = 1;
Шапка.Параметры.Дата = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
// Выводим её в нашу печатную форму.
ПечатнаяФорма.Вывести(Шапка);
// # Заголовок табличной части #
ТабличнаяЧастьЗаголовок =
Макет.ПолучитьОбласть("ТабличнаяЧастьЗаголовок");
ПечатнаяФорма.Вывести(ТабличнаяЧастьЗаголовок);
// # Строки табличной части #
// Если при выводе строк наша таблица не поместится на страницу // будем повторять заголовок таблицы в начале страницы.
// Выводим с 3 по 4 строки - это как раз заголовок таблицы.
// Использовать область "ТабличнаяЧастьЗаголовок" не получится,
// так как нужны именно строки целиком.
ПечатнаяФорма.ПовторятьПриПечатиСтроки = Макет.Область(3,,4);
ТабличнаяЧастьСтрока = Макет.ПолучитьОбласть("ТабличнаяЧастьСтрока");
СсылкаНаКлубнику =
Справочники.Номенклатура.НайтиПоНаименованию("Клубника");
// Сгруппируем строки таблицы в сворачивающийся блок.
ПечатнаяФорма.НачатьГруппуСтрок("Товар", Истина);
Для Шаг = 1 По 100 Цикл
ТабличнаяЧастьСтрока.Параметры.Номенклатура = СсылкаНаКлубнику;
ТабличнаяЧастьСтрока.Параметры.Количество = Шаг;
// В макете мы выделили ячейку с номенклатурой и прописали
// её параметр расшифровки "РасшифровкаНоменклатуры".
// Заполним этот параметр, чтобы когда пользователь кликнет
// два раза по товару - открылась его форма.
// Дополнительный пример обработки расшифровки - см. ниже,
// когда мы выводим табличный документ в поле формы.
ТабличнаяЧастьСтрока.Параметры.РасшифровкаНоменклатуры =
СсылкаНаКлубнику;
ПечатнаяФорма.Вывести(ТабличнаяЧастьСтрока);
КонецЦикла;
// Закончим начатую группировку.
ПечатнаяФорма.ЗакончитьГруппуСтрок();
Возврат ПечатнаяФорма;
КонецФункции
/// Как настроить колонтитулы печатной формы в 1с 8.3, 8.2
&НаКлиенте
Процедура НастроитьКолонтитулы(ПечатнаяФорма)
// Верхний колонтитул.
ПечатнаяФорма.ВерхнийКолонтитул.Выводить = Истина;
ПечатнаяФорма.ВерхнийКолонтитул.НачальнаяСтраница = 1;
ПечатнаяФорма.ВерхнийКолонтитул.ТекстВЦентре = "Этот отчёт сделан нами
для тестов";
ПечатнаяФорма.ВерхнийКолонтитул.ВертикальноеПоложение =
ВертикальноеПоложение.Центр;
// Нижний колонтитул.
ПечатнаяФорма.НижнийКолонтитул.Выводить = Истина;
ПечатнаяФорма.НижнийКолонтитул.ТекстСправа = "[&НомерСтраницы] из
[&СтраницВсего]";
ПечатнаяФорма.НижнийКолонтитул.ТекстВЦентре = "[&Дата][&Время]";
// Использованные выше конструкции [&НомерСтраницы] и т.п. предопределены
// платформой.
КонецПроцедуры
/// Как настроить параметры печати табличного документа в 1с 8.3, 8.2
&НаКлиенте
Процедура НастроитьПараметрыПечати(ПечатнаяФорма)
// Можно установить конкретный масштаб:
ПечатнаяФорма.МасштабПечати = 60; // 60%
// Или указать вариант "по ширине страницы"
ПечатнаяФорма.АвтоМасштаб = Истина;
// Поля страницы
ПечатнаяФорма.ПолеСлева = 10;
ПечатнаяФорма.ПолеСверху = 10;
ПечатнаяФорма.ПолеСправа = 10;
ПечатнаяФорма.ПолеСнизу = 10;
// Партрет или альбом (ландшафт).
ПечатнаяФорма.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
// Двусторонняя печать позволяет очень экономить бумагу.
ПечатнаяФорма.ДвусторонняяПечать = ТипДвустороннейПечати.Нет;
// Количество страниц на листе при выводе документа на печать.
// 1 - одна страницы, 2 - две, 0 - автоматическое определение.
ПечатнаяФорма.ЭкземпляровНаСтранице = 1;
// Количество копий документа, которое нужно напечатать.
ПечатнаяФорма.КоличествоЭкземпляров = 1;
// Если печатаем несколько экземпляров - очень удобная галка.
ПечатнаяФорма.РазборПоКопиям = Истина;
// Не будем отображать сетку пользователю.
ПечатнаяФорма.ОтображатьСетку = Ложь;
// А также запретим редактирование ячеек отчёта.
ПечатнаяФорма.ТолькоПросмотр = Истина;
// Зафиксируем верхние 4 строки таблицы, чтобы
// пользователю было удобно прокручивать
// вниз печатную форму.
ПечатнаяФорма.ФиксацияСверху = 4;
ПечатнаяФорма.ФиксацияСлева = 0;
КонецПроцедуры
/// Как изменить табличный документ программно в 1с 8.3, 8.2
&НаСервере
Процедура МеняемТабличныйДокументПрограммно(Макет)
ОбластьЯчеек = Макет.Область("Шапка");
ОбластьЯчеек.ЦветТекста = Новый Цвет(255, 0, 0);
ОбластьЯчеек.ГраницаСверху =
Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.БольшойПунктир, 2);
ОбластьЯчеек.ГраницаСлева =
Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.БольшойПунктир, 2);
ОбластьЯчеек.ГраницаСправа =
Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.БольшойПунктир, 2);
ОбластьЯчеек.ГраницаСнизу =
Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.БольшойПунктир, 2);
ОбластьЯчеек.Примечание.Текст = "Привет";
// и т.д. и т.п.
КонецПроцедуры
/// Как в обработать расшифровку в отчёте в 1с 8.3, 8.2
&НаКлиенте
Процедура ПолеСПечатнойФормойОбработкаРасшифровки(Элемент, Расшифровка,
СтандартнаяОбработка)
// Дополнительная обработка расшифровки возможна только
// для табличного документа, который выведен на форму.
// Это событие мы прописали для элемента формы, который связан
// с реквизитом, имеющим тип "ТабличныйДокумент".
Сообщить("Обработка расшифровки");
Сообщить(Элемент.ТекущаяОбласть.Имя);
Сообщить(Расшифровка);
// Мы не хотим, чтобы открывалось значение расшифровки,
// которое мы программно прописали в печатной форме.
// Остановим дальнейшую обработку расшифровки.
СтандартнаяОбработка = Ложь;
КонецПроцедуры
/// Как вывести табличный документ на форму в 1с 8.3, 8.2
&НаКлиенте
Процедура ВыводимТабличныйДокументНаФорму(Команда)
// Предварительно создаём на форме реквизит с именем
// "ПолеСПечатнойФормой" и типом ТабличныйДокумент,
// а затем перетаскиваем его в элементы формы.
ВыводимТабличныйДокументНаФормуНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыводимТабличныйДокументНаФормуНаСервере()
// Формируем табличный документ.
ПечатнаяФорма = СформироватьПечатнуюФормуИзТабличногоДокумента();
// Выводим его в соотв. реквизит формы.
ПолеСПечатнойФормой.Очистить();
ПолеСПечатнойФормой.Вывести(ПечатнаяФорма);
// После этого он автоматически отобразится
// в поле формы, с которым он связан.
КонецПроцедуры
/// Как использовать табличный документ для ввода данных в 1с 8.3, 8.2
&НаКлиенте
Процедура НастраиваемТаблицуДляВводаДанных(Команда)
// В начале выводим в поле формы табличный документ
// из макета с именем "ТабличныйМакетДляВвода"
НастраиваемТаблицуДляВводаДанныхНаСервере();
// После этого пользователь должен ввести значение,
// а мы его получим в коде ниже.
КонецПроцедуры
&НаСервере
Процедура НастраиваемТаблицуДляВводаДанныхНаСервере()
ПолеСПечатнойФормой.Очистить();
Макет =
Обработки.ОбработкаДляИспытаний.ПолучитьМакет("ТабличныйМакетДляВвода");
Форма = Макет.ПолучитьОбласть("ФормаВвода");
ПолеСПечатнойФормой.Вывести(Форма);
КонецПроцедуры
&НаКлиенте
Процедура УзнатьКакойЖеТоварВыбралПользователь(Команда)
// Имя ячейки ввода мы задали в макете.
ПолеВвода = ПолеСПечатнойФормой.Область("ПолеТовар");
Если ПолеВвода.Значение.Пустая() Тогда
Сообщить("Укажите товар в табличной форме ввода!");
Иначе
Сообщить("Вы выбрали " + ПолеВвода.Значение);
КонецЕсли;
КонецПроцедуры
Как создать табличный макет в 1С
В этом уроке мы научимся создавать табличные макеты в 1С, которые в дальнейшем могут
быть использованы для программного формирования печатных форм.
К примеру, как я сформировал макеты для тестовой базы.
Я зашёл в форму обработки и перешёл на закладку "Макеты":
Далее я нажал на "Плюсик" и выбрал тип "Табличный документ":
Открылся редактор табличного документа:
Во многих моментах работа в редакторе похожа на работу в программе Excel, но есть свои
особенности, на которых я бы хотел остановиться.
Оглавление

Как создать табличный макет в 1С
o Как назначить имя области
o Как посмотреть уже назначенные имена
o Как задать параметр области
o Как задать параметр расшифровки?
o Дальнейшее напутствие
Как назначить имя области
Что я понимаю под областью? Это и несколько строк и несколько ячеек, в общем любая часть
табличного документа, которая может быть выделена нами, используя левую кнопку мыши.
Вот выделенная область из двух строк:
А вот выделенная область из 2 столбцов:
А сейчас мы выделим область на пересечении первых двух строк и первых двух столбцов:
Так вот. Если мы сумели выделить нужную нам область, то, нажав на ней правой кнопкой и
выбрав пункт "Свойства", мы сможем присвоить ей имя, по-которому мы будем к ней
обращаться из нашего кода, формируя печатную форму:
Это базовый навык, которым мы должны овладеть, чтобы суметь делать табличные макеты.
Как посмотреть уже назначенные имена
А давайте посмотрим какие имена областям уже назначены в макете?
Для этого из меню конфигуратора выбираем:
Вот она наша только что назначенная область "Шапка":
А если сейчас выделим её в диалоге и нажмём "Выбрать", то в редакторе будет выбрана соотв.
область ячеек:
Как задать параметр области
Часто при формировании печатной области требуется не просто вывести область из макета.
Нужно ещё и заполнить определенные ячейки определенными параметрами.
Эти параметры мы задаём у области и заданные значения автоматически попадают в нужные
ячейки.
Для этого в свойствах нужной нам ячейки (куда будет выводиться значение параметра)...
Указываем в поле "Заполнение" значение "Параметр", а в поле "Параметр" пишем имя, по
которому мы будем обращаться к этому параметру из кода:
Если же указать в заполнении не "Параметр", а "Шаблон", то можно будет в самой ячейке
указать какой-то текст (шаблон) с использованием имени параметра в квадратных скобках:
В этом случае имя параметра (и его позиция в шаблоне) указывается в квадратных скобках.
Как задать параметр расшифровки?
Имя параметра расшифровки задаётся всё в тех же свойствах ячейки:
Уже потом из кода мы присвоим этому параметру (по имени "РасшифровкаНоменклатуры")
нужное значение (ссылку на элемент номенклатуры).
И когда пользователь сделает двойной щелчок на этой ячейки - ему откроется значение,
присвоенное параметру расшифровки (в данном случае откроется форма элемента
номенклатуры).
Дальнейшее напутствие
Мы рассмотрели необходимые основы. А теперь внимательно исследуйте рабочий пример.
Скачайте и разверните эту базу. Найдите в ней обработку "ОбработкаДляИспытаний".
В её макетах есть табличные варианты. Исследуйте их как можно тщательнее, опираясь на
приёмы, которые мы рассмотрели чуть выше.
Уже затем (в этой же обработке) переходите к примерам использования этих макетов. Только
так вы научитесь создавать свои печатные формы на основе табличных макетов.
Основы запросов
/// Как запросить все строки со значениями всех столбцов
/// из таблицы в 1с 8.3, 8.2
&НаСервере
Процедура КакЗапроситьВсеСтрокиИВсеСтолбцыИзТаблицыНаСервере()
// Если нужно выбрать абсолютно все столбцы
// из таблицы - используем звёздочку.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| *
|ИЗ
| Справочник.Номенклатура"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как запросить все строки со значениями определенных столбцов
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакЗапроситьВсеСтрокиСЗначениямиОпределенныхСтолбцовНаСервере()
// У каждого столбца в таблице есть своё имя.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Наименование,
| Вкус,
| Цвет
|ИЗ
| Справочник.Номенклатура"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как использовать в запросах псевдонимы для столбцов и таблиц
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакИспользоватьПсевдонимыВЗапросахНаСервере()
// Псевдонимы делают текст запроса более лаконичным
// и понятным.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Продукты.Наименование КАК ИмяПродукта,
|
Продукты.Вкус КАК ВкусПродукта
| ИЗ
|
Справочник.Номенклатура КАК Продукты"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как добавить в результат запроса столбец с определенным
/// значением в 1с 8.3, 8.2
&НаСервере
Процедура
КакДобавитьВРезультатЗапросаСтолбецСОпределеннымЗначениемНаСервере()
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Наименование,
| 1000 КАК Цена,
| Калорийность
|ИЗ
| Справочник.Номенклатура"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как убрать дубликаты из результата запроса в 1с 8.3, 8.2
&НаСервере
Процедура КакУбратьДубликатыИзРезультатаЗапросаНаСервере()
// В справочнике Цвета есть повторящиеся элементы.
// Построим запрос так, чтобы в результат попали
// только различные цвета.
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Наименование
|ИЗ
| Справочник.Цвета"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как ограничить количество строк в результате запроса
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакОграничитьКоличествоСтрокВРезультатеЗапросаНаСервере()
// Сделаем выборку первых 5 самых каллорийных продуктов.
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 5
| Наименование,
| Калорийность
|ИЗ
| Справочник.Номенклатура
|УПОРЯДОЧИТЬ ПО
|
Калорийность УБЫВ"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как отобрать из таблицы только те строки,
/// на чтение которых у пользователя есть права в 1с 8.3, 8.2
&НаСервере
Процедура КакВыбратьТолькоРазрешенныеСтрокиНаСервере()
// Эта возможность нужна для баз, в которых
// включено ограничение прав на уровне записей (RLS).
// Например, мы хотим, чтобы конкретный пользователь ни
// при каких условиях не смог прочитать документы
// другой организации, которые хранятся в этой же базе.
// Вот и получается, что на некоторые записи (строки) таблицы
// документов ему надо дать права на чтение, а не некоторые нет.
// Если данное слово не указать, то в случае, когда запрос
// выберет записи, на которые у пользователя нет прав,
// запрос отработает с ошибкой.
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|
Ссылка
| ИЗ
|
Документ.ПродажаЕды"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
Группировка в запросах
/// Как сгруппировать исходные данные в запросе в 1с 8.3, 8.2
&НаСервере
Процедура КакСгруппироватьИсходныеДанныеВЗапросеНаСервере()
// Группировка - это свёртка строчек таблицы по определенному
// признаку.
//
//
//
//
//
//
В группировке участвуют поля двух типов: группировочные
и группируемые.
Группировочные - это те поля, по которым (в разрезе которых)
идёт свёртка.
Группируемые - это те поля, которые сворачиваются (например,
суммируются.
//
//
//
//
//
//
//
Свёртка группируемых полей проводится при помощи
агрегатных функций:
СУММА
СРЕДНЕЕ
МИНИМУМ
МАКСИМУМ
КОЛИЧЕСТВО [РАЗЛИЧНЫЕ]
//
//
//
//
//
Обратите внимание, что при группировке (в отличие от итогов)
происходит удаление детальных записей (строк) таблицы.
То есть при подведении итогов - записей в результате запроса
становится больше, а при группировке - меньше.
Подробнее см. урок выше.
// Сгруппируем элементы справочника Номенклатура
// в разрезе цвета (группировочное поле) по
// калорийности (группируемое поле) при помощи функции СУММА.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Цвет,
|
СУММА(Калорийность)
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
ЭтоГруппа = ЛОЖЬ
|СГРУППИРОВАТЬ ПО
|
Цвет"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Возможно ли cгруппировать без группируемых полей в запросе
&НаСервере
Процедура КакСгруппироватьБезГруппируемыхПолейНаСервере()
// Наличие группируемых полей не является обязательным в группировке.
// Рассмотрим такой пример.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Цвет
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
ЭтоГруппа = ЛОЖЬ
|СГРУППИРОВАТЬ ПО
|
Цвет"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
// В данном случае результат запроса аналогичен тому,
// если бы мы запросили ВЫБРАТЬ РАРЗЛИЧНЫЕ цвета из
// элементов справочника Номенклатура.
КонецПроцедуры
/// Возможно ли сгруппировать без группировочных полей
/// в запросе (то есть в целом по таблице) в 1с 8.3, 8.2
&НаСервере
Процедура КакСгруппироватьБезГруппировочныхПолейНаСервере()
// Наличие группировочных полей также не является обязательным
// в группировке.
// Получим средние значения калорийности, жиров, белков и
// углеводов в целом по всем элементам номенклатуры.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
СРЕДНЕЕ(Калорийность),
|
СРЕДНЕЕ(Жиры),
|
СРЕДНЕЕ(Белки),
|
СРЕДНЕЕ(Углеводы)
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
ЭтоГруппа = ЛОЖЬ"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
Условия в запросах
/// Как наложить условия на выбранные строки в запросе до группировки
&НаСервере
Процедура УсловиеНаВыбранныеСтрокиНаСервере()
// Для задания условия отбора данных из исходных таблиц
// используется секция ГДЕ.
// Сделаем отбор продуктов с калорийностью
// от 100 до 300.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Калорийность
| ИЗ
|
Справочник.Номенклатура
| ГДЕ
|
Калорийность > 100 И Калорийность < 300"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как наложить условия на уже сгруппированные строки в запросе
&НаСервере
Процедура УсловиеНаАгрегатныеФункцииНаСервере()
// Для того, чтобы наложить условие на значение
// агрегатных функций, которые используются при группировке
// используется секция ИМЕЮЩИЕ.
// Выведем цвета продуктов, имеющих максимальную калорийность
// до 250.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Цвет,
|
МАКСИМУМ(Калорийность)
| ИЗ
|
Справочник.Номенклатура
| СГРУППИРОВАТЬ ПО
|
Цвет
| ИМЕЮЩИЕ
|
МАКСИМУМ(Калорийность) < 250"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
Упорядочивание в запросах
/// Как упорядочить результат запроса по
/// определенным полям в 1с 8.3, 8.2
&НаСервере
Процедура КакУпорядочитьРезультатЗапросаПоПолямНаСервере()
// Чтобы сортировать строки в результате запроса
// используется секция УПОРЯДОЧИТЬ ПО.
// Требуется вывести продукты, упорядоченные
// сначала по возрастанию цвета, а затем
// по убыванию калорийности.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Цвет,
|
Калорийность
|ИЗ
|
Справочник.Номенклатура
|УПОРЯДОЧИТЬ ПО
|
Цвет ВОЗР,
|
Калорийность УБЫВ"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как упорядочить результат запроса по
/// выражению в 1с 8.3, 8.2
&НаСервере
Процедура КакУпорядочитьРезультатЗапросаПоВыражениюНаСервере()
// В секции УПОРЯДОЧИТЬ ПО можно использовать
// выражения.
// Например, упорядочим продукты по
// максимальному содержанию белков и углеводов
// вместе.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Белки,
|
Углеводы,
|
Жиры,
|
Вода
|ИЗ
|
Справочник.Номенклатура
|УПОРЯДОЧИТЬ ПО
|
(Белки + Углеводы) УБЫВ"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как упорядочить результат запроса по
/// иерархии в 1с 8.3, 8.2
&НаСервере
Процедура КакУпорядочитьРезультатЗапросаПоИерархииНаСервере()
// Для таблиц, для которых задано свойство иерархичности
// возможно упорядочивание в соответствии с иерархией.
// К примеру, сделаем вывод элементов из
// справочника "Номенклатура" в порядке
// их следования в иерархии справочника.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Вкусы КАК Вкусы
|УПОРЯДОЧИТЬ ПО
| Наименование Иерархия"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как упорядочить результат запроса по
/// агрегатной функции группировки в 1с 8.3, 8.2
&НаСервере
Процедура КакУпорядочитьРезультатЗапросаПоАгрегатнойФункцииНаСервере()
// В секции УПОРЯДОЧИТЬ ПО также возможно использование
// агрегатных функций, которые были использованы для
// группировки результата запроса.
// Для каждого цвета - выберем минимальную калорийность
// продукта, имеющиего такой цвет. А затем отсортируем
// результат по возрастанию этой минимальной калорийности.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Цвет,
|
МИНИМУМ(Калорийность)
|ИЗ
|
Справочник.Номенклатура
|СГРУППИРОВАТЬ ПО
|
Цвет
|УПОРЯДОЧИТЬ ПО
|
МИНИМУМ(Калорийность) ВОЗР");
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как работает автоупорядочивание результата
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакРаботаетАвтоупорядочиваниеНаСервере()
// Предложение АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим
// автоматического формирования полей для упорядочивания
// результата запроса.
// Автоупорядочивание работает по следующим принципам:
// Если в запросе было указано предложение УПОРЯДОЧИТЬ ПО,
// то каждая ссылка на таблицу, находящаяся в этом предложении,
// будет заменена полями, по которым по умолчанию сортируется таблица
// (для справочников это код или наименование, для документов – дата
// документа). Если поле для упорядочивания ссылается на иерархический
справочник,
// то будет применена иерархическая сортировка по этому справочнику.
//
//
//
//
//
//
Если в запросе отсутствует предложение УПОРЯДОЧИТЬ ПО,
но есть предложение ИТОГИ, тогда результат запроса будет
упорядочен по полям, присутствующим в предложении
ИТОГИ после ключевого слова ПО, в той же последовательности и,
в случае если итоги рассчитывались по полям – ссылкам,
то по полям сортировки по умолчанию таблиц, на которые были ссылки.
// Если в запросе отсутствуют предложения УПОРЯДОЧИТЬ ПО и ИТОГИ,
// но есть предложение СГРУППИРОВАТЬ ПО, тогда результат запроса
//
//
//
//
будет упорядочен по полям, присутствующим в предложении,
в той же последовательности и, в случае если группировка велась
по полям – ссылкам, то по полям сортировки по умолчанию таблиц,
на которые были ссылки.
//
//
//
//
В случае же, если в запросе отсутствуют предложения и
УПОРЯДОЧИТЬ ПО, ИТОГИ и СГРУППИРОВАТЬ ПО, результат будет
упорядочен по полям сортировки по умолчанию для таблиц,
из которых выбираются данные, в порядке их появления в запросе.
// В случае, если запрос содержит предложение ИТОГИ, каждый уровень
// итогов упорядочивается отдельно.
// В примере ниже мы сортируем по полю Ссылка и используем
// ключевое слово АВТОУПОРЯДОЧИВАНИЕ. Система при этом
// заменит поле Ссылка в секции УПОРЯДОЧИТЬ ПО на дату документа.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Ссылка
|ИЗ
|
Документ.ПродажаЕды
|УПОРЯДОЧИТЬ ПО
|
Ссылка ВОЗР
|АВТОУПОРЯДОЧИВАНИЕ"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
Функции в запросах
/// Как в запросе задать константу типа дата в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеЗадатьКонстантуТипаДатаНаСервере()
// Нужное значение даты можно передать в запрос через
// параметр, либо указать значение даты прямо
// в тексте запроса.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ДАТАВРЕМЯ(2013, 12, 31, 23, 59, 59) КАК ЗаСекундуДоНовогоГода"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Функции работы с датами в запросах в 1с 8.3, 8.2
&НаСервере
Процедура ФункцииДляРаботыСДатамиВЗапросахНаСервере()
// Как получить начало или конец периода в запросах 1С 8.3, 8.2
// НАЧАЛОПЕРИОДА(Дата, Период)
// КОНЕЦПЕРИОДА(Дата, Период)
// Как добавить сдвиг к дате в запросах 1С 8.3, 8.2
// ДОБАВИТЬКДАТЕ(Дата, Период, Количество)
// Как вычислить разность между датами в запросах 1С 8.3, 8.2
// РАЗНОСТЬДАТ(Дата1, Дата2, Период)
// Как вычислить квартал, месяц или день даты в запросах 1С 8.3, 8.2
// КВАРТАЛ(Дата), Месяц(Дата), День(Дата)
// Период принимает одно из значений
//
Секунда
//
Минута
//
Час
//
День
//
Неделя
//
Декада
//
Месяц
//
Квартал
//
Полугодие
//
Год
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Ссылка,
|
ДОБАВИТЬКДАТЕ(Дата, Квартал, 1) КАК ПлюсКвартал,
|
РАЗНОСТЬДАТ(Дата, &ВыбДата, Месяц) КАК РазностьВМесяцах,
|
КВАРТАЛ(Дата) КАК Квартал,
|
МЕСЯЦ(Дата) КАК Месяц,
|
ДЕНЬ(Дата) КАК День
|ИЗ
|
Документ.ПродажаЕды
|ГДЕ
|
Дата МЕЖДУ
|
НАЧАЛОПЕРИОДА(&ВыбДата, Год) И
|
КОНЕЦПЕРИОДА(&ВыбДата, Год)"
);
Запрос.УстановитьПараметр("ВыбДата", '20140601');
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как в запросе указать значение поля предопределенной записи
/// одной из таблиц в 1с 8.3, 8.2
&НаСервере
Процедура КакУказатьПредопределенноеЗначениеВЗапросеНаСервере()
// К примеру, требуется вывести только тех котрагентов, у которых
// значение поля Пол равно значению перечисления Мужской.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Пол
|ИЗ
|
Справочник.Контрагенты
|ГДЕ
|
Пол = ЗНАЧЕНИЕ(Перечисление.Пол.Мужской)
|"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
// Или требуется выбрать проводки по дебету бухгалтерского счёта 50.01,
// обратившись к нему через предопределенное имя КассаОрганизации.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| СчетДт,
| СчетКт,
| Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный
|ГДЕ
| СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КассаОрганизации)"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как использовать условный оператор выбора в запросе в 1с 8.3, 8.2
&НаСервере
Процедура КакИспользоватьУсловныйОператорВыбораВЗапросеНаСервере()
// При помощи условного оператора выбора добавим
// в результат запроса новое поле описывающее
// количество жира в продукте.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Жиры,
|
ВЫБОР
|
КОГДА Жиры = 0 ТОГДА
|
""Здесь жира нет""
|
КОГДА Жиры < 10 ТОГДА
|
""Средняя жирность""
|
ИНАЧЕ
|
""Очень жирный продукт""
|
|
КОНЕЦ КАК ОписаниеЖирности
| ИЗ
|
Справочник.Номенклатура
|"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как в запросе проверить поле на соответствие ссылочному типу
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеПроверитьПолеНаСсылочныйТипНаСервере()
// Сделаем отбор только тех бухгалтерских проводок, у которых
// регистратором является документ типа "ПродажаЕды"
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Регистратор,
| СчетДт,
| СчетКт,
| Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный
|ГДЕ
| Регистратор ССЫЛКА Документ.ПродажаЕды"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как в запросе проверить значение на вхождение в
/// диапазон (включительно) в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеПроверитьЗначениеНаДиапазонНаСервере()
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Наименование,
| Калорийность
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| Калорийность МЕЖДУ 200 И 300"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как в запросе проверить значение на вхождение в список
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеПроверитьЗначениеНаВхождениеВСписокНаСервере()
// Выведем солёные и сладкие продукты.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Наименование,
| Вкус
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| Вкус В (
|
&СладкийВкус,
|
&СолёныйВкус
| )"
);
Запрос.УстановитьПараметр("СладкийВкус",
Справочники.Вкусы.НайтиПоНаименованию("Сладкий")
);
Запрос.УстановитьПараметр("СолёныйВкус",
Справочники.Вкусы.НайтиПоНаименованию("Солёный")
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
// Обратите внимание. У оператора "В" есть вариант "В ИЕРАРХИИ".
// Например, ГДЕ Город В ИЕРАРХИИ (... список групп городов ...)
КонецПроцедуры
/// Как в запросе сравнить строку с шаблоном в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеСравнитьСтрокуСШаблономНаСервере()
//
//
//
//
%
_
[]
[^]
-
любое количество произвольных символов
один произвольный символ
любой одиночный символ, перечисленный внутри скобок
любой одиночный символ, кроме тех, что внутри скобок после ^
// К примеру, выберем контрагентов, которые содержат
// слова, оканчивающиеся на "ов ".
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Контрагенты
|ГДЕ
|
Наименование ПОДОБНО ""%_[о][в][ ]%"""
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как проверить в запросе на отсутствие поля (то есть значение NULL)
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеПроверитьПолеНаNULLНаСервере()
// Ну, например, выберем из справочника Контрагенты только
// те элементы, у которых нет поля "Пол" (очевидно, что
// такими элементами окажутся группы).
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Пол
|ИЗ
|
Справочник.Контрагенты
|ГДЕ
|
Пол ЕСТЬ NULL"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
// Обратите внимание, что сюда не попали элементы,
// у которых это поле есть, но просто не заполнено.
КонецПроцедуры
/// Как в запросе проверить и заменить NULL на другое значение в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеЗаменитьNULLНаДругоеЗначениеНаСервере()
// Добавим в предыдущем примере вывод фразы "NULL", если
// Пол ЕСТЬ NULL.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
ЕСТЬNULL(Пол, ""NULL"")
|ИЗ
|
Справочник.Контрагенты"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как получить пустую ссылку в запросе в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеПолучитьПустуюСсылкуНаСервере()
// Получим только тех контрагентов, у которых поле Пол есть,
// но оно не заполнено.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Пол
|ИЗ
|
Справочник.Контрагенты
|ГДЕ
|
Пол = ЗНАЧЕНИЕ(Перечисление.Пол.ПустаяСсылка)"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
//
//
//
//
аналогично пишутся
ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ЗНАЧЕНИЕ(Документ.ПродажаЕды.ПустаяСсылка)
и т.д.
КонецПроцедуры
/// Как использовать значение Неопределено в запросе
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакВЗапросеИспользоватьНеопределеноНаСервере()
// Значение данного типа применяются, когда необходимо
// использовать пустое значение, не принадлежащее ни к
// одному другому типу.
// Например, такое значение изначально имеют реквизиты
// с составным типом значения.
// Для примера отберём только те города, у которых
// не заполнено поле ОтличительныйПризнак (оно имеет
// составной тип).
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
ОтличительныйПризнак
|ИЗ
|
Справочник.Города
|ГДЕ
|
ОтличительныйПризнак = Неопределено"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
Итоги в запросах
/// Как получить итоги по одному полю в разрезе другого
/// поля в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьИтогиПоОдномуПолюНаСервере()
//
//
//
//
//
//
//
Итоги подводятся одних полей в разрезе других.
Для вычисления итогов используются агрегатные функции:
СУММА
МАКСИМУМ
МИНИМУМ
СРЕДНЕЕ
КОЛИЧЕСТВО
// При подведении итогов в таблицу включаются дополнительные
// строки с самими итогами.
// Для примера подведём итоги калорийности продуктов
// в разрезе цвета.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Цвет,
|
Наименование,
|
Калорийность
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
ЭтоГруппа = Ложь
|ИТОГИ
|
СУММА(Калорийность)
|ПО
|
Цвет"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как получить итоги в целом
/// по таблице в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьИтогиВЦеломПоТаблицеНаСервере()
// Узнаем среднюю калорийность продуктов в целом
// по всей таблице справочника.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Калорийность
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
ЭтоГруппа = Ложь
|ИТОГИ
|
СРЕДНЕЕ(Калорийность)
|ПО
|
ОБЩИЕ"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как получить итоги одних полей в разрезе
/// нескольких других в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьИтогиНесколькихПолейНаСервере()
// Посчитаем итоги Калорийность, Жиры, Белки и Углеводы
// по цветам и вкусам продуктов, а также в целом
// по таблице.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Цвет,
|
Вкус,
|
Наименование,
|
Калорийность,
|
Жиры,
|
Белки,
|
Углеводы
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
ЭтоГруппа = Ложь
|ИТОГИ
|
СУММА(Калорийность),
|
СУММА(Жиры),
|
СУММА(Белки),
|
СУММА(Углеводы)
|ПО
|
ОБЩИЕ,
|
Цвет,
|
Вкус"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как получить итоги по иерархии в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьИтогиПоИерархииНаСервере()
// Если мы подводим итоги в разрезе поля, тип которого имеет
иерархическую
// структуру - можно использовать ключевое слово ИЕРАРХИЯ,
// чтобы подвести итоги по всем уровням вложенности.
// Для примера выведем среднюю цену на продукты, установленную для
клиентов,
// в разрезе элементов и групп справочника Номенклатура.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Период,
|
Номенклатура,
|
Цена
|ИЗ
|
РегистрСведений.ЦенаНаЕдуДляКлиентов КАК ЦенаНаЕдуДляКлиентов
|ИТОГИ
|
СРЕДНЕЕ(Цена)
|ПО
|
Номенклатура ИЕРАРХИЯ";
ВыполнитьЗапросИВывестиНаФорму(Запрос);
//
//
//
//
Обратите внимание, что у ключевого слова ИЕРАРХИЯ есть вариант
ТОЛЬКО ИЕРАРХИЯ. В этом случае итоги будут подводиться
только по иерархии (группам) без расчёта итогов в контрольных
точках (элементах).
КонецПроцедуры
Соединение в запросах
/// Как сделать внутреннее соединение таблиц в 1с 8.3, 8.2
&НаСервере
Процедура ВнутреннееСоединениеТаблиц()
// Соединения используются, чтобы сопоставить (соединить)
// строки одной таблицы строкам другой таблицы
// по определенному признаку.
//
//
//
//
//
//
//
//
//
//
//
------------|Люди
|
------------|ИМЯ
|
------------|Алена
|
|Алефтина
|
|Владимир
|
|Владислав |
|
|
-------------
-------------------------------|
Характеристики
|
--------------------------------|
ИМЯ
ВОЗРАСТ
|
--------------------------------|
Алена
21
|
|
Алефтина
18
|
|
Павел
25
|
|
Петр
30
|
|
Порфирий
50
|
---------------------------------
//
Результат внутреннего соединения по имени:
//
//
//
ИмяИзТаблицы1
Алена
Алефтина
ИмяИзТаблицы2
Алена
Алефтина
ВозрастИзТаблицы2
21
18
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Люди.Наименование КАК ИмяИзТаблицы1,
|
Характеристики.Наименование КАК ИмяИзТаблицы2,
|
Характеристики.Возраст КАК ВозрастИзТаблицы2
|ИЗ
|
Справочник.Люди КАК Люди
|
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
|
Справочник.Характеристики КАК Характеристики
|
ПО
|
Люди.Наименование = Характеристики.Наименование"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как сделать левое внешнее соединение таблиц в 1с 8.3, 8.2
&НаСервере
Процедура ЛевоеСоединениеТаблиц()
// Левое соединение - это внутреннее
// соединение + строки из левой таблицы, для которых не
// найдены соответствия.
//
//
//
//
//
//
//
//
//
//
//
------------|Люди
|
------------|ИМЯ
|
------------|Алена
|
|Алефтина
|
|Владимир
|
|Владислав |
|
|
-------------
-------------------------------|
Характеристики
|
--------------------------------|
ИМЯ
ВОЗРАСТ
|
--------------------------------|
Алена
21
|
|
Алефтина
18
|
|
Павел
25
|
|
Петр
30
|
|
Порфирий
50
|
---------------------------------
//
Результат левого внешнего соединения по имени:
//
//
//
//
//
ИмяИзТаблицы1
Алена
Алефтина
Владимир
Владислав
ИмяИзТаблицы2
Алена
Алефтина
NULL
NULL
ВозрастИзТаблицы2
21
18
NULL
NULL
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Люди.Наименование КАК ИмяИзТаблицы1,
|
Характеристики.Наименование КАК ИмяИзТаблицы2,
|
Характеристики.Возраст КАК ВозрастИзТаблицы2
|ИЗ
|
Справочник.Люди КАК Люди
|
ЛЕВОЕ СОЕДИНЕНИЕ
|
Справочник.Характеристики КАК Характеристики
|
ПО
|
Люди.Наименование = Характеристики.Наименование"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как сделать правое внешнее соединение таблиц в 1с 8.3, 8.2
&НаСервере
Процедура ПравоеСоединениеТаблиц()
// Правое соединение - это внутреннее
// соединение + строки из правой таблицы, для которых
// не найдены соответствия.
//
//
//
//
//
//
//
//
//
//
//
------------|Люди
|
------------|ИМЯ
|
------------|Алена
|
|Алефтина
|
|Владимир
|
|Владислав |
|
|
-------------
-------------------------------|
Характеристики
|
--------------------------------|
ИМЯ
ВОЗРАСТ
|
--------------------------------|
Алена
21
|
|
Алефтина
18
|
|
Павел
25
|
|
Петр
30
|
|
Порфирий
50
|
---------------------------------
//
Результат правого внешнего соединения по имени:
//
//
//
//
//
//
ИмяИзТаблицы1
Алена
Алефтина
NULL
NULL
NULL
ИмяИзТаблицы2
Алена
Алефтина
Павел
Петр
Порфирий
ВозрастИзТаблицы2
21
18
25
30
50
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Люди.Наименование КАК ИмяИзТаблицы1,
|
Характеристики.Наименование КАК ИмяИзТаблицы2,
|
Характеристики.Возраст КАК ВозрастИзТаблицы2
|ИЗ
|
Справочник.Люди КАК Люди
|
ПРАВОЕ СОЕДИНЕНИЕ
|
Справочник.Характеристики КАК Характеристики
|
ПО
|
Люди.Наименование = Характеристики.Наименование"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как сделать полное внешнее соединение таблиц в 1с 8.3, 8.2
&НаСервере
Процедура ПолноеСоединениеТаблиц()
//
Полное соединение - это левое соединение + правое соединение.
//
-------------
--------------------------------
//
//
//
//
//
//
//
//
//
//
|Люди
|
------------|ИМЯ
|
------------|Алена
|
|Алефтина
|
|Владимир
|
|Владислав |
|
|
-------------
|
Характеристики
|
--------------------------------|
ИМЯ
ВОЗРАСТ
|
--------------------------------|
Алена
21
|
|
Алефтина
18
|
|
Павел
25
|
|
Петр
30
|
|
Порфирий
50
|
---------------------------------
// Результат полного внешнего соединения по имени:
//
//
//
//
//
//
//
//
ИмяИзТаблицы1
Алена
Алефтина
Владимир
Владислав
NULL
NULL
NULL
ИмяИзТаблицы2
Алена
Алефтина
NULL
NULL
Павел
Петр
Порфирий
ВозрастИзТаблицы2
21
18
NULL
NULL
25
30
50
Запрос = Новый Запрос(
" ВЫБРАТЬ
|
Люди.Наименование КАК ИмяИзТаблицы1,
|
Характеристики.Наименование КАК ИмяИзТаблицы2,
|
Характеристики.Возраст КАК ВозрастИзТаблицы2
|ИЗ
|
Справочник.Люди КАК Люди
|
ПОЛНОЕ СОЕДИНЕНИЕ
|
Справочник.Характеристики КАК Характеристики
|
ПО
|Люди.Наименование = Характеристики.Наименование"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как сделать перекрестное соединение таблиц в 1с 8.3, 8.2
&НаСервере
Процедура ПерекрестноеСоединениеТаблиц()
//
//
//
//
//
------------|Люди
|
------------|ИМЯ
|
-------------
-------------------------------|
Характеристики
|
--------------------------------|
ИМЯ
ВОЗРАСТ
|
---------------------------------
//
//
//
//
//
//
|Алена
|
|Алефтина
|
|Владимир
|
|Владислав |
|
|
-------------
|
Алена
21
|
|
Алефтина
18
|
|
Павел
25
|
|
Петр
30
|
|
Порфирий
50
|
---------------------------------
// Результат перекрестного соединения:
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
ИмяИзТаблицы1
Алена
Алена
Алена
Алена
Алена
Алефтина
Алефтина
Алефтина
Алефтина
Алефтина
Владимир
Владимир
Владимир
Владимир
Владимир
Владислав
Владислав
Владислав
Владислав
Владислав
ИмяИзТаблицы2
Алена
Алефтина
Павел
Петр
Порфирий
Алена
Алефтина
Павел
Петр
Порфирий
Алена
Алефтина
Павел
Петр
Порфирий
Алена
Алефтина
Павел
Петр
Порфирий
ВозрастИзТаблицы2
21
18
25
30
50
21
18
25
30
50
21
18
25
30
50
21
18
25
30
50
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Люди.Наименование КАК ИмяИзТаблицы1,
|
Характеристики.Наименование КАК ИмяИзТаблицы2,
|
Характеристики.Возраст КАК ВозрастИзТаблицы2
|ИЗ
|
Справочник.Люди КАК Люди,
|
Справочник.Характеристики КАК Характеристики"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
Объединение в запросах
/// Как объединить две таблицы в одну в 1с 8.3, 8.2
&НаСервере
Процедура КакОбъединитьДвеТаблицыВОднуНаСервере()
// Требования к объединяем таблицам:
// - Одинаковое количество полей
// Если соотв. друг другу поля в разных таблицах имеют
// один и тот же тип, то результатирующее поле будет
// также иметь этот тип.
// Если же соотв. друг другу поля в разных таблицах имеют
// разный тип, то результатирующее поле будет иметь
// составной тип.
// Объединим таблицу Вкусы и Цвета в одну.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Наименование
|ИЗ
|
Справочник.Вкусы
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Цвета"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как объединить больше двух таблиц в одну в 1с 8.3, 8.2
&НаСервере
Процедура КакОбъединитьБольшеДвухТаблицНаСервере()
// Очень легко. Для примера объединим сразу 3 таблицы:
// Контрагенты, Номенклатура и Города.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Наименование
|ИЗ
|
Справочник.Контрагенты
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Номенклатура
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Города"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как оставить дубликаты в результате
/// объединения таблиц в 1с 8.3, 8.2
&НаСервере
Процедура КакОставитьДубликатыВРезультатеОбъединенияНаСервере()
//
//
//
//
По умолчанию (при использовании ключевого слова ОБЪЕДИНИТЬ)
все дубликаты (образованные из разных запросов) из результата
объединения удаляются. Если нужно оставить все строки используем ОБЪЕДИНИТЬ ВСЕ
// Для примера объединим таблицу саму с собой так, чтобы дубликаты,
// которые при этом неизбежно образуются остались в результате.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Цвета
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Цвета"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как упорядочить объединение таблиц в 1с 8.3, 8.2
&НаСервере
Процедура КакУпорядочитьОбъединениеТаблицНаСервере()
// Нет смысла применять упорядочивание к отдельным таблицам
// до их объединения. Упорядочивать (группировать, подводить итоги)
// имеет смысл только конечный результат объединения.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Номенклатура
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Цвета
|
|УПОРЯДОЧИТЬ ПО
|
Наименование УБЫВ"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как объединить таблицы с разным количеством полей
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакОбъединитьТаблицыСРазнымКоличествомПолейНаСервере()
// Нужно дописать недостающие поля и присвоить им
// какие-то значения.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Калорийность
|ИЗ
|
Справочник.Номенклатура
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|
Наименование,
|
0
|ИЗ
|
Справочник.Вкусы"
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
Параметры в запросах
/// Как передать в запрос параметры простых типов в 1с 8.3, 8.2
&НаСервере
Процедура КакПередатьВЗапросПараметрыПростыхТиповНаСервере()
// Сделаем отбор продаж за 1 квартал 2014 года.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Ссылка
|ИЗ
|
Документ.ПродажаЕды
|ГДЕ
|
Дата МЕЖДУ &НачалоПериода И &ОкончаниеПериода
|УПОРЯДОЧИТЬ ПО
|
Дата ВОЗР"
);
Запрос.УстановитьПараметр("НачалоПериода", '20140101000000');
Запрос.УстановитьПараметр("ОкончаниеПериода", '20140331235959');
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как передать в запрос параметры ссылочных типов в 1с 8.3, 8.2
&НаСервере
Процедура КакПередатьВЗапросПараметрыСсылочныхТиповНаСервере()
// Сделаем отбор продуктов со сладким вкусом.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Вкус
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
Вкус = &ВыбВкус"
);
Запрос.УстановитьПараметр("ВыбВкус",
Справочники.Вкусы.НайтиПоНаименованию("Сладкий")
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как передать в запрос параметр списочного типа в 1с 8.3, 8.2
&НаСервере
Процедура КакПередатьВЗапросПараметрСписокНаСервере()
// Сделаем отбор продуктов, вкусы которых входят в переданный
// нами список.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Вкус
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
Вкус В (&СписокВкусов)"
);
Список = Новый Массив;
Список.Добавить(
Справочники.Вкусы.НайтиПоНаименованию("Сладкий")
);
Список.Добавить(
Справочники.Вкусы.НайтиПоНаименованию("Солёный")
);
Запрос.УстановитьПараметр("СписокВкусов",
Список
);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как передать в запрос таблицу значений в качестве
/// параметра в 1с 8.3, 8.2
&НаСервере
Процедура КакПередатьТаблицуЗначенийВКачествеПараметраНаСервере()
// Сделаем отбор продуктов в соответствии с переданной
// в запрос таблицей сочетания цвета и вкуса.
СочетанияЦветаИВкуса = новый ТаблицаЗначений;
СочетанияЦветаИВкуса.Колонки.Добавить("Цвет",
Новый ОписаниеТипов("СправочникСсылка.Цвета"));
СочетанияЦветаИВкуса.Колонки.Добавить("Вкус",
Новый ОписаниеТипов("СправочникСсылка.Вкусы"));
// красный + сладкий
Стр = СочетанияЦветаИВкуса.Добавить();
Стр.Цвет =
Справочники.Цвета.НайтиПоНаименованию("Красный");
Стр.Вкус =
Справочники.Вкусы.НайтиПоНаименованию("Сладкий");
// жёлтый + солёный
Стр = СочетанияЦветаИВкуса.Добавить();
Стр.Цвет =
Справочники.Цвета.НайтиПоНаименованию("Жёлтый");
Стр.Вкус =
Справочники.Вкусы.НайтиПоНаименованию("Солёный");
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Наименование,
|
Цвет,
|
Вкус
|ИЗ
|
Справочник.Номенклатура
|ГДЕ
|
(Цвет, Вкус) В (&СписокСочетаний)"
);
Запрос.УстановитьПараметр("СписокСочетаний", СочетанияЦветаИВкуса);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
/// Как использовать таблицу переданную в запрос в качестве
/// источника в 1с 8.3, 8.2
&НаСервере
Процедура КакИспользоватьТаблицуПараметрВКачествеИсточникаНаСервере()
// Создадим и заполним таблицу значений в коде, а затем
// передадим её в запрос.
Страны = новый ТаблицаЗначений;
Страны.Колонки.Добавить("Название", Новый ОписаниеТипов("Строка"));
Страны.Колонки.Добавить("Численность", Новый ОписаниеТипов("Число"));
НоваяСтрока = Страны.Добавить();
НоваяСтрока.Название = "Россия";
НоваяСтрока.Численность = 144000000;
НоваяСтрока = Страны.Добавить();
НоваяСтрока.Название = "Австралия";
НоваяСтрока.Численность = 23000000;
НоваяСтрока = Страны.Добавить();
НоваяСтрока.Название = "Новая зеландия";
НоваяСтрока.Численность = 4400000;
// Сначала выбираем переданные значения во временную
// таблицу, а уже затем работаем с временной таблицей
// как с обычной.
Запрос = Новый Запрос(
"ВЫБРАТЬ
|
Название,
|
Численность
|ПОМЕСТИТЬ
|
ВременнаяТаблица
|ИЗ
|
&ТаблицаСтран КАК Страны
|;
|ВЫБРАТЬ
|
Название,
|
Численность
|ИЗ
|
ВременнаяТаблица
|УПОРЯДОЧИТЬ ПО
|
Численность УБЫВ"
);
Запрос.УстановитьПараметр("ТаблицаСтран", Страны);
ВыполнитьЗапросИВывестиНаФорму(Запрос);
КонецПроцедуры
Документы
Описание:
Документ - одно из основных понятий системы 1С:Предприятие. При помощи документов
организуется ввод в систему информации о совершаемых хозяйственных операциях, а также
ее просмотр и корректировка.
В большинстве своем документы, которые создаются в процессе настройки конфигурации
задачи, являются электронными аналогами стандартных бумажных документов, являющихся
основаниями для тех или иных учетных действий или расчетов. Тем не менее, использование
этого типа данных может выходить далеко за рамки простой фиксации изменений,
внесенных в учетные регистры.
Структура каждого конкретного вида документа определяется при его создании в
конфигураторе. У любого вида документа существуют реквизиты, которые создаются
автоматически - это "Дата" и "Номер". Номер создается, если при конфигурировании длина
номера указана больше 0. Другие реквизиты документа определяются в конфигураторе
отдельно для каждого создаваемого вида документа.
Оглавление (нажмите, чтобы раскрыть)
























/// Как выбрать и упорядочить документы за период
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакВыбратьИУпорядочитьДокументыЗаПериодНаСервере()
// найдём все документы поступления еды за 2014 год
// упорядочив их по возрастанию даты
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Ссылка
|ИЗ
|
Документ.ПоступлениеЕды КАК ПоступлениеЕды
|ГДЕ
|
Дата МЕЖДУ &НачДата И &КонДата
|УПОРЯДОЧИТЬ ПО
|
Дата ВОЗР";
Запрос.УстановитьПараметр("НачДата", '20140101');
Запрос.УстановитьПараметр("КонДата", '20141231');
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументов = РезультатЗапроса.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
Сообщить(ВыборкаДокументов.Ссылка);
КонецЦикла;
КонецПроцедуры
/// Как найти документ по номеру в 1с 8.3, 8.2
&НаСервере
Процедура КакНайтиДокументПоНомеруНаСервере()
// найдём поступление еды № ВМБП-000005 за 2014 год
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Ссылка
|ИЗ
|
Документ.ПоступлениеЕды КАК ПоступлениеЕды
|ГДЕ
|
Дата МЕЖДУ &НачДата И &КонДата И
|
Номер = &ВыбНомер";
Запрос.УстановитьПараметр("НачДата", '20140101');
Запрос.УстановитьПараметр("КонДата", '20141231');
Запрос.УстановитьПараметр("ВыбНомер", "ВМБП-000005");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументов = РезультатЗапроса.Выбрать();
Если ВыборкаДокументов.Следующий() Тогда
Сообщить(ВыборкаДокументов.Ссылка);
Иначе
Сообщить("Документ с таким номером не существует!");
КонецЕсли;
КонецПроцедуры
/// Как найти документы по реквизиту в 1с 8.3, 8.2
&НаСервере
Процедура КакНайтиДокументПоРеквизитуНаСервере()
// найдём все документы поступления еды
// от поставщика ООО "Поле"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Ссылка,
|
Поставщик
|ИЗ
|
Документ.ПоступлениеЕды КАК ПоступлениеЕды
|ГДЕ
|
Поставщик = &ВыбПоставщик
|УПОРЯДОЧИТЬ ПО
|
Дата ВОЗР";
Запрос.УстановитьПараметр(
"ВыбПоставщик",
Справочники.Поставщики.НайтиПоНаименованию("ООО ""Поле""")
);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументов = РезультатЗапроса.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
Сообщить(
Строка(ВыборкаДокументов.Ссылка) + " " +
ВыборкаДокументов.Поставщик
);
КонецЦикла;
КонецПроцедуры
/// Как выбрать все документы, которые не проведены и
/// не помечены на удаление в 1с 8.3, 8.2
&НаСервере
Процедура КакВыбратьВсеДокументыКоторыеНеПроведеныИНеПомеченыНаУдалениеНаСервере(
// найдём не проведенные и не помеченные на удаление
// документы поступления еды
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Ссылка,
|
Проведен,
|
ПометкаУдаления
|ИЗ
|
Документ.ПоступлениеЕды КАК ПоступлениеЕды
|ГДЕ
|
Проведен = ЛОЖЬ И
|
ПометкаУдаления = ЛОЖЬ
|УПОРЯДОЧИТЬ ПО
|
Дата ВОЗР";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументов = РезультатЗапроса.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
Сообщить(
Строка(ВыборкаДокументов.Ссылка) + " " +
ВыборкаДокументов.Проведен + " " +
ВыборкаДокументов.ПометкаУдаления
);
КонецЦикла;
КонецПроцедуры
/// Как найти подчиненные документы в 1с 8.3, 8.2
&НаСервере
Процедура КакНайтиПодчиненныеДокументыНаСервере()
// Рассмотрим работу с подчиненными (связанными) документами
// на примере документов: ПоступлениеТоваровУслуг и СчетФактураПолученный.
// Документ СчетФактураПолученный вводится на основании документа
// ПоступлениеТоваровУслуг, то есть счет фактура является подчиненной
// по отношению к поступлению.
//
//
//
//
Факт подчиненности обычно (в типовых) фиксируется в самом подчиненном
документе через табличную часть ДокументыОснования.
Почему через табличную часть? Потому что один документ может зависеть
(быть подчиненным) сразу от нескольких родителей (оснований).
//
//
//
//
//
Пример №1.
У нас есть ссылка на поступление товаров и услуг. Требуется найти
счёт-фактуры, которые были введены на основании этого поступления.
В дереве подчиненности эти фактуры будут подчинены (зависимы) от
документа поступления.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Ссылка
|ИЗ
|
Документ.СчетФактураПолученный.ДокументыОснования КАК
|
СчетФактураПолученныйДокументыОснования
|ГДЕ
|
СчетФактураПолученныйДокументыОснования.ДокументОснование =
|
&ВыбПоступление";
Запрос.УстановитьПараметр("ВыбПоступление",
Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("0000-000004", '20160101'
);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ПодчиненнаяФактура = ВыборкаДетальныеЗаписи.Ссылка;
Сообщить(ПодчиненнаяФактура);
КонецЦикла;
// Пример №2.
// У нас есть ссылка на счет-фактуру полученную. Требуется найти,
// документы, на основании которых она была введена (родителей).
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ДокументОснование
|ИЗ
|
Документ.СчетФактураПолученный.ДокументыОснования КАК
|
СчетФактураПолученныйДокументыОснования
|ГДЕ
|
СчетФактураПолученныйДокументыОснования.Ссылка =
|
&ВыбСчетФактура";
Запрос.УстановитьПараметр("ВыбСчетФактура",
Документы.СчетФактураПолученный.НайтиПоНомеру("0000-000007", '20160101')
);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
РодительФактуры = ВыборкаДетальныеЗаписи.ДокументОснование;
Сообщить(РодительФактуры);
КонецЦикла;
КонецПроцедуры
///
Как перебрать (перечислить) строки табличной части документа в 1с 8.3, 8.2
&НаСервере
Процедура КакПеречислитьСтрокиИзТабличнойЧастиДокументаНаСервере()
// У документа ПоступлениеЕды есть табличная часть 'Еда'.
// У этой табличной части есть колонки: Номенклатура, Количество,
// Сумма.
ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231');
// перечислим строки табличной части этого документа
// при помощи объектной техники
Для Каждого Строка Из ПоступлениеСсылка.Еда Цикл
Сообщить(
Строка.Номенклатура.Наименование + " " +
Строка.Количество + " шт. " +
Строка.Сумма + " руб."
);
КонецЦикла;
// при помощи запроса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ПоступлениеЕдыЕда.Номенклатура,
|
ПоступлениеЕдыЕда.Количество,
|
ПоступлениеЕдыЕда.Сумма
|ИЗ
|
Документ.ПоступлениеЕды.Еда КАК ПоступлениеЕдыЕда
|ГДЕ
|
ПоступлениеЕдыЕда.Ссылка = &ВыбПоступление";
Запрос.УстановитьПараметр("ВыбПоступление", ПоступлениеСсылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(
ВыборкаДетальныеЗаписи.Номенклатура.Наименование + " " +
ВыборкаДетальныеЗаписи.Количество + " шт. " +
ВыборкаДетальныеЗаписи.Сумма + " руб."
);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура СозданиеИИзменениеДокументовНаСервере()
/// Как создать новый документ в 1с 8.3, 8.2
// создадим новый документ поступление еды
Поступление = Документы.ПоступлениеЕды.СоздатьДокумент();
// заполним шапку документа
Поступление.Дата = ТекущаяДата();
Поступление.Поставщик =
Справочники.Поставщики.НайтиПоНаименованию(
"ООО ""Кузбас"""
);
Поступление.Склад =
Справочники.Склады.НайтиПоНаименованию(
"Основной"
);
// заполним табличную часть Еда
НоваяСтрока = Поступление.Еда.Добавить();
НоваяСтрока.Номенклатура =
Справочники.Еда.НайтиПоНаименованию(
"Банан"
);
НоваяСтрока.Количество = 10;
НоваяСтрока.Сумма = 550;
/// Как записать документ в 1с 8.3, 8.2
Поступление.Записать(РежимЗаписиДокумента.Запись);
/// Как провести документ в 1с 8.3, 8.2
Поступление.Записать(РежимЗаписиДокумента.Проведение);
/// Как отменить проведение документа в 1с 8.3, 8.2
Поступление.Записать(РежимЗаписиДокумента.ОтменаПроведения);
/// Как внести изменения в документ по ссылке в 1с 8.3, 8.2
// зачастую у нас есть только ссылка на документ
// и чтобы по ней получить сам объект документа
// для изменения нужно вызывать метод ПолучитьОбъект
// найдём документ продажа еды под номером ВМБП-000001
// для лаконичности примера воспользуемся не запросом,
// а объектной техникой
СсылкаНаПродажу = Документы.ПродажаЕды.НайтиПоНомеру(
"ВМБП-000001",
'20141231' // поиск среди документов 2014 года
);
// нам вернули не сам документ, а ссылку (указатель) на него
// проверим - нашёлся ли вообще документ
Если СсылкаНаПродажу.Пустая() Тогда
Сообщить("Документ не найден.");
Иначе
// получим сам документ по ссылке
Продажа = СсылкаНаПродажу.ПолучитьОбъект();
// вот его уже можно изменять и записывать
Продажа.Клиент =
Справочники.Клиенты.НайтиПоНаименованию(
"Пётр"
);
Продажа.Записать();
КонецЕсли;
/// Как получить пустую ссылку типа документ в 1с 8.3, 8.2
ПустаяСсылка = Документы.ПродажаЕды.ПустаяСсылка();
Если ПустаяСсылка.Пустая() Тогда
Сообщить("Ссылка действительно пустая.");
КонецЕсли;
/// Как скопировать существующий документ в 1с 8.3, 8.2
// скопируем найденный документ на продажу и запишем
// как новый документ от сегодняшнего числа
КопияПродажи = СсылкаНаПродажу.Скопировать();
КопияПродажи.Дата = ТекущаяДата();
КопияПродажи.Комментарий = "Копия документа " +
Строка(СсылкаНаПродажу);
// запишем и проведём документ
КопияПродажи.Записать(РежимЗаписиДокумента.Проведение);
/// Как заблокировать документ перед изменениями
/// в 1с 8.3, 8.2
// выполним блокировку документа
// от изменения другими режимами или пользователями
Продажа = СсылкаНаПродажу.ПолучитьОбъект();
Если Не Продажа.Заблокирован() Тогда
Продажа.Заблокировать();
// тут идёт какой-то долгий алгоритм
// в результате которого мы меняем
// заблокированный элемент
Продажа.Комментарий = "Документ изменён.";
Продажа.Записать();
// и только потом освобождаем его
// для других режимов и пользователей
Продажа.Разблокировать();
КонецЕсли;
/// Как создать новый документ на основании другого объекта
/// в 1с 8.3, 8.2
// создадим документ продажа на основании поступления
// скопировав из поступления табличную часть
//
//
//
//
в модуле документа ПродажаЕды я определил процедуру
ОбработкаЗаполнения, которая обрабатывает ситуации
когда мы заполняем один элемент на основании
данных другого (см. в базе для скачивания)
ПродажаНаОсновании = Документы.ПродажаЕды.СоздатьДокумент();
ПродажаНаОсновании.Дата = ТекущаяДата();
ПродажаНаОсновании.Комментарий =
"Документ введён на основании " + Строка(Поступление.Ссылка);
ПродажаНаОсновании.Заполнить(Поступление.Ссылка);
ПродажаНаОсновании.Записать(РежимЗаписиДокумента.Проведение);
/// Как пометить на удаление документ в 1с 8.3, 8.2
ПродажаНаОсновании.УстановитьПометкуУдаления(Истина);
// метод Записать вызывать не нужно
КонецПроцедуры
/// Как найти и изменить программно движения документа
/// по регистрам в 1с 8.3, 8.2
&НаСервере
Процедура КакНайтиИИзменитьДвиженияДокументаНаСервере()
// предположим у нас есть ссылка на проведенный
// документ поступления еды № ВМБП-000002
ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231');
//
//
//
//
мы знаем, что этот документ делает записи по
двум регистрам:
- регистр накопления "ЗапасЕды"
- регистр бухгалтерии "Хозрасчетный"
// наша задача: найти записи по регистру "ЗапасЕды"
// изменить их (например, удвоим количество)
// и записать вместо старых
// используем объектную технику получения движений,
// ведь мы будем их изменять
Поступление = ПоступлениеСсылка.ПолучитьОбъект();
// получим набор записей этого документа в регистр ЗапасыЕды
НаборЗаписей = Поступление.Движения.ЗапасыЕды;
// прочитаем записи из базы данных
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// выведем старые значения
Сообщить(
Строка(Запись.ВидДвижения) + " " +
Запись.Еда + " " + Запись.Количество
);
// изменим запись, удвоив количество
Запись.Количество = Запись.Количество * 2;
КонецЦикла;
// добавим новую запись
НоваяЗапись = НаборЗаписей.ДобавитьПриход();
НоваяЗапись.Склад =
Справочники.Склады.НайтиПоНаименованию("Основной");
НоваяЗапись.Еда =
Справочники.Еда.НайтиПоНаименованию("Банан");
НоваяЗапись.Количество = 3;
НоваяЗапись.Период = ТекущаяДата();
// разом запишем набор записей
НаборЗаписей.Записать(
Истина // удалим старые движения и запишем вместо них новые
);
//
//
//
//
теперь движения документа № ВМБП-000002 отличаются от тех,
что были записаны документом при проведении
чтобы вернуть их к начальному виду - нужно
перепровести документ
КонецПроцедуры
/// Как прочитать движения документа по регистрам запросом
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакПрочитатьДвиженияДокументаЗапросомНаСервере()
// этот приём используется, если не требуется изменять
// найденные записи
// предположим у нас есть ссылка на проведенный
// документ поступления еды № ВМБП-000002
ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231');
//
//
//
//
мы знаем, что этот документ делает записи по
двум регистрам:
- регистр накопления "ЗапасЕды"
- регистр бухгалтерии "Хозрасчетный"
// прочитаем записи по регистру "ЗапасЕды" запросом
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЗапасыЕды.НомерСтроки,
|
ЗапасыЕды.ВидДвижения,
|
ЗапасыЕды.Еда,
|
ЗапасыЕды.Количество
|ИЗ
|
РегистрНакопления.ЗапасыЕды КАК ЗапасыЕды
|ГДЕ
|
ЗапасыЕды.Регистратор = &ВыбРегистратор
|
|УПОРЯДОЧИТЬ ПО
|
ЗапасыЕды.НомерСтроки";
Запрос.УстановитьПараметр("ВыбРегистратор", ПоступлениеСсылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(
"#" + ВыборкаДетальныеЗаписи.НомерСтроки +
" " + ВыборкаДетальныеЗаписи.ВидДвижения +
" " + ВыборкаДетальныеЗаписи.Еда +
" " + ВыборкаДетальныеЗаписи.Количество
);
КонецЦикла;
КонецПроцедуры
/// Как изменить проведенный документ, не меняя его
/// движений (проводок) в 1с 8.3, 8.2
&НаСервере
Процедура КакИзменитьПроведенныйДокументНеМеняяЕгоДвиженийНаСервере()
//
//
//
//
бывает так, что есть проведенный документ
в уже закрытом периоде и нужно изменить
некоторое поле документа, но так чтобы
не поменялись проводки документа
ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000005", '20141231');
// Изменим количество в табличной части этого документа
// на 1, но чтобы проводки (движения) остались прежними
Поступление = ПоступлениеСсылка.ПолучитьОбъект();
Для Каждого Строка Из Поступление.Еда Цикл
Строка.Количество = 1;
КонецЦикла;
// если сейчас просто записать документ
// изменятся его проводки, ведь он уже проведён
// но если установить флаг Загрузка
Поступление.ОбменДанными.Загрузка = Истина;
// то можно записать проведенный документ
// без повторного проведения
Поступление.Записать();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПродажуПоНомеру(Номер, Интервал)
Возврат Документы.ПродажаЕды.НайтиПоНомеру(
Номер, Интервал
);
КонецФункции
/// Как открыть форму существующего документа по ссылке
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоДокумента(Команда)
СсылкаНаДокумент = ПолучитьПродажуПоНомеру("ВМБП-000006", '20141231');
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму(
"Документ.ПродажаЕды.ФормаОбъекта", // имя формы
ПараметрыФормы // параметры для формы
);
КонецПроцедуры
/// Как открыть форму выбора документа и
/// отследить её закрытие в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуВыбораДокумента(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораДокумента",
ЭтотОбъект);
ОткрытьФорму(
"Документ.ПродажаЕды.ФормаВыбора",,,,,,ОповещениеОЗакрытии
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораДокумента(Результат, Параметры) Экспорт
Если Результат <> Неопределено Тогда
Сообщить("Был выбран документ " + Результат);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция НайтиПоставщикаПоИмени(Имя)
Возврат Справочники.Поставщики.НайтиПоНаименованию(
Имя
);
КонецФункции
/// Как открыть форму списка (журнал) документов и
/// с отбором по реквизиту в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуСпискаДокументовСОтбором(Команда)
// откроем список поступлений, оставив
// только те, что от поставщика ООО "Поле"
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Поставщик",
НайтиПоставщикаПоИмени("ООО ""Поле"""));
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
ОткрытьФорму(
"Документ.ПоступлениеЕды.ФормаСписка",
ПараметрыФормы
);
КонецПроцедуры
/// Как открыть форму только что созданного, но ещё
/// не записанного документа в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоДокумента(Команда)
// получаем форму нового документа
ФормаНовогоДокумента = ПолучитьФорму(
"Документ.ПоступлениеЕды.ФормаОбъекта",,, Истина);
// делаем копию её данных (так как напрямую их менять
// нельзя)
КопияДанныхФормы = ФормаНовогоДокумента.Объект;
// заполняем эти данные на сервере
ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);
// копируем заполненные данные в исходную форму
КопироватьДанныеФормы(КопияДанныхФормы,
ФормаНовогоДокумента.Объект);
// показываем форму нового заполненного
// документа пользователю
ФормаНовогоДокумента.Открыть();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
// преобразуем данные формы в документ
Поступление = ДанныеФормыВЗначение(ДанныеФормы,
Тип("ДокументОбъект.ПоступлениеЕды"));
// заполним только табличную часть
НоваяСтрока = Поступление.Еда.Добавить();
НоваяСтрока.Номенклатура =
Справочники.Еда.НайтиПоНаименованию(
"Банан"
);
НоваяСтрока.Количество = 10;
НоваяСтрока.Сумма = 550;
// преобразуем документа обратно в данные формы
ЗначениеВДанныеФормы(Поступление, ДанныеФормы);
КонецПроцедуры
Константы
Константы в системе 1С:Предприятие, как правило, служат для хранения информации,
которая либо совсем не изменяется в процессе функционирования системы, либо изменяется
достаточно редко. В константах хранится информация, характеризующая прикладную задачу
в целом. Наиболее простой пример подобной информации - название организации, которое,
как правило, не меняется.
В программных модулях для общих действий над заданными в конфигураторе константами
(получение формы для управления константами, создание набора констант) служит
объект КонстантыМенеджер. Для одновременного изменения значений определенной
группы констант следует пользоваться объектом КонстантыНабор. Для чтения и записи
значения определенной константы можно обращаться к
объекту КонстантаМенеджер.<Имя константы>.
&НаСервере
Процедура ВыполнитьКодНаСервере()
/// Как получить и изменить значение константы в 1с 8.3, 8.2
// менеджер значений создаётся и используется неявно
Сообщить(Константы.ЛучшийКлиент.Получить());
Константы.ЛучшийКлиент.Установить(
Справочники.Клиенты.НайтиПоНаименованию("Марина")
);
/// Работа с константой через менеджер значений в 1с 8.3, 8.2
// создаём и используем менеджер значений константы напрямую
ЛюбимаяЕда = Константы.ЛюбимаяЕда.СоздатьМенеджерЗначения();
// читаем значение
ЛюбимаяЕда.Прочитать();
Сообщить(ЛюбимаяЕда.Значение);
// меняем значение
ЛюбимаяЕда.Значение = Справочники.Еда.НайтиПоНаименованию(
"Крыжовник");
// записываем значение
ЛюбимаяЕда.Записать();
/// Работа с константами через набор в 1с 8.3, 8.2
// подходит для работы сразу с группой констант
НазванияКонстант = "ЛюбимаяЕда, ЛучшийКлиент";
НаборКонстант = Константы.СоздатьНабор(НазванияКонстант);
// читаем набор констант
НаборКонстант.Прочитать();
Сообщить(НаборКонстант.ЛюбимаяЕда);
Сообщить(НаборКонстант.ЛучшийКлиент);
// меняем значения констант
НаборКонстант.ЛюбимаяЕда = Справочники.Еда.НайтиПоНаименованию(
"Чипсы");
НаборКонстант.ЛучшийКлиент = Справочники.Клиенты.НайтиПоНаименованию(
"Пётр");
// записываем набор
НаборКонстант.Записать();
/// Как получить значения всех констант в 1с 8.3, 8.2
Для Каждого Константа Из Константы Цикл
Сообщить(Строка(Константа) + " = " + Константа.Получить());
КонецЦикла;
КонецПроцедуры
Перечисления
Описание:
Перечисления являются средством для работы с элементами данных, список возможных
значений которых жестоко задан в данной прикладной задаче. Ссылки на элементы
перечисления могут быть использованы в реквизитах объектов конфигурации.
Например, в конфигурации можно задать перечисление "ВидыКонтрагентов", определяющее
допустимые виды контрагентов, со значениями "Организация" и "ФизЛицо".
Набор значений перечисления задается при конфигурировании.
/// Как вывести все значения перечисления в 1с 8.3, 8.2
&НаСервере
Процедура КакВывестиВсеЗначенияПеречисленияНаСервере()
ВременаГода = Перечисления.ВременаГода;
// первый способ
Для Каждого Время Из ВременаГода Цикл
Сообщить(Время);
КонецЦикла;
// второй способ
Для Индекс = 0 По ВременаГода.Количество() - 1 Цикл
Сообщить(ВременаГода.Получить(Индекс));
КонецЦикла;
КонецПроцедуры
/// Как открыть форму списка значений перечисления в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьСписокЗначенийПеречисления(Команда)
ОткрытьФорму("Перечисление.ВременаГода.ФормаСписка");
КонецПроцедуры
/// Как открыть форму выбора значений перечисления в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуВыбораЗначенияПеречисления(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораПеречисления",
ЭтотОбъект);
ОткрытьФорму("Перечисление.ВременаГода.ФормаВыбора",,,,,,
ОповещениеОЗакрытии);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПеречисления(РезультатЗакрытия,
ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(РезультатЗакрытия) Тогда
Сообщить(РезультатЗакрытия);
КонецЕсли;
КонецПроцедуры
Регистры бухгалтерии
/// Как прочитать бухгалтерские проводки без значений
/// субконто в 1с 8.3, 8.2
&НаСервере
Процедура КакПрочитатьПроводкиБезСубконтоНаСервере()
// За журнал проводок отвечает таблица РегистрБухгалтерии.Хозрасчетный.
// Обратите внимание, что в ней нет информации о субконто - аналитике
// счетов, участвующих в проводках.
// получим все бухгалтерские проводки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Хозрасчетный.Период КАК Период,
|
Хозрасчетный.Организация,
|
Хозрасчетный.СчетДт,
|
Хозрасчетный.СчетКт,
|
Хозрасчетный.КоличествоДт,
|
Хозрасчетный.КоличествоКт,
|
Хозрасчетный.Сумма
|ИЗ
|
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
|
Хозрасчетный.Активность = Истина
|УПОРЯДОЧИТЬ ПО
|
Период";
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"[" + Формат(Записи.Период, "ДФ=dd.MM.yy") + "]
"Дт " + Записи.СчетДт + " " +
"Кт " + Записи.СчетКт + " " +
Записи.Сумма + " руб.");
КонецЦикла;
КонецПроцедуры
/// Как прочитать бухгалтерские проводки вместе со
/// значениями субконто в 1с 8.3, 8.2
&НаСервере
Процедура КакПрочитатьПроводкиВместеССубконтоНаСервере()
" +
//
//
//
//
//
//
//
//
За получение бухгалтерских проводок вместе с их аналитикой (субконто)
отвечает виртуальная таблица ДвиженияССубконто,
у неё есть параметры:
1. Начало периода
2. Конец периода
3. Условие
4. Порядок (влияет только на отбор первых)
5. Первые (отбор перых N записей)
// Получим проводки за 1 квартал 2014 года, где счёт 41.01 в
// дебете или кредите, вместе с их аналитикой (субконто).
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ХозрасчетныйДвиженияССубконто.Период КАК Период,
|
ХозрасчетныйДвиженияССубконто.Организация,
|
ХозрасчетныйДвиженияССубконто.Регистратор,
|
ХозрасчетныйДвиженияССубконто.Активность,
|
ХозрасчетныйДвиженияССубконто.СчетДт,
|
ХозрасчетныйДвиженияССубконто.СубконтоДт1,
|
ХозрасчетныйДвиженияССубконто.СубконтоДт2,
|
ХозрасчетныйДвиженияССубконто.СубконтоДт3,
|
ХозрасчетныйДвиженияССубконто.СчетКт,
|
ХозрасчетныйДвиженияССубконто.СубконтоКт1,
|
ХозрасчетныйДвиженияССубконто.СубконтоКт2,
|
ХозрасчетныйДвиженияССубконто.СубконтоКт3,
|
ХозрасчетныйДвиженияССубконто.Сумма,
|
ХозрасчетныйДвиженияССубконто.КоличествоДт,
|
ХозрасчетныйДвиженияССубконто.КоличествоКт
|ИЗ
|
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
|
ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
|
ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59),
|
Активность = Истина И (
|
СчетДт = &ВыбСчет ИЛИ СчетКт = &ВыбСчет)
|
)
|
КАК ХозрасчетныйДвиженияССубконто
|УПОРЯДОЧИТЬ ПО
|
Период Возр";
Запрос.УстановитьПараметр("ВыбСчет",
ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01"));
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"[" + Формат(Записи.Период, "ДФ=dd.MM.yy") + "]
" +
"Дт " + Записи.СчетДт + " " +
"(" + Записи.СубконтоДт1 + ", " + Записи.СубконтоДт2 + ")" +
" " +
"Кт " + Записи.СчетКт + " " +
"(" + Записи.СубконтоКт1 + ", " + Записи.СубконтоКт2 + ")" +
" " +
Записи.Сумма + " руб.");
КонецЦикла;
КонецПроцедуры
/// Как получить обороты между бухгалтерскими счетами в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьОборотыМеждуСчетамиНаСервере()
// Пример №1
Сообщить("Пример №1");
//
//
//
//
//
//
//
//
//
//
//
//
//
//
За получение оборотов между счётом и корреспондирующим счётом
за произвольный период с заданной периодичностью в различных
разрезах аналитики отвечает виртуальная таблица Обороты,
у неё есть следующие параметры:
1. Начало периода
2. Конец периода
3. Периодичность (например, Период, Запись, Год, Месяц...)
4. Условие счета (например, Счет = &ВыбСчет)
5. Субконто (список видов субконто, влияет на доступность
и смысл Субконто1, Субконто2.., которыми можно оперировать
в запросе).
6. Условие (например, Субконто1 = &ВыбСклад)
7. Условие корсчета (аналогично условию счёта)
8. КорСубконто (аналогично субконто)
// Узнаем сколько пришло и сколько ушло товара на основной склад
// за январь 2014 года. То есть получим дебетовые и кредитовые
// обороты по счёту 41.01, субконто Склады (значение "Основной склад")
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ХозрасчетныйОбороты.Счет,
|
ХозрасчетныйОбороты.Субконто1 КАК Склад,
|
ХозрасчетныйОбороты.Организация,
|
ХозрасчетныйОбороты.СуммаОборотДт КАК ПришёлТовар,
|
ХозрасчетныйОбороты.СуммаОборотКт КАК УшёлТовар,
|
ХозрасчетныйОбороты.СуммаОборот КАК Разница
|ИЗ
|
РегистрБухгалтерии.Хозрасчетный.Обороты(
|
ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
|
ДАТАВРЕМЯ(2014, 01, 31, 23, 59, 59),
|
Период,
|
Счет = &ВыбСчет,
|
&ВидыСубконто,
|
Субконто1 = &ВыбСклад
|
)
|КАК ХозрасчетныйОбороты";
Запрос.УстановитьПараметр("ВыбСчет",
ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01")
);
ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады
);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
Запрос.УстановитьПараметр("ВыбСклад",
Справочники.Склады.НайтиПоНаименованию("Основной")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Если Записи.Следующий() Тогда
Сообщить("Счёт " + Записи.Счет + " (" + Записи.Склад + ")");
Сообщить("Пришёл товар на " + Записи.ПришёлТовар + " руб.");
Сообщить("Ушёл товар на " +Записи.УшёлТовар + " руб.");
Сообщить("Разница между поступление и списанием " +
Записи.Разница + " руб."
);
КонецЕсли;
// ===========================================================
// Пример №2
Сообщить("Пример №2");
// Узнаем сколько пришло товара на основной склад
// за каждый месяц 2014 года.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ХозрасчетныйОбороты.Период,
|
ХозрасчетныйОбороты.Счет,
|
ХозрасчетныйОбороты.Субконто1 КАК Склад,
|
ХозрасчетныйОбороты.Организация,
|
ХозрасчетныйОбороты.СуммаОборотДт КАК ПришёлТовар
|ИЗ
|
РегистрБухгалтерии.Хозрасчетный.Обороты(
|
ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
|
ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59),
|
Месяц,
|
Счет = &ВыбСчет,
|
&ВидыСубконто,
|
Субконто1 = &ВыбСклад
|
) КАК ХозрасчетныйОбороты
|УПОРЯДОЧИТЬ ПО
|
Период Возр";
Запрос.УстановитьПараметр("ВыбСчет",
ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01")
);
ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады
);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
Запрос.УстановитьПараметр("ВыбСклад",
Справочники.Склады.НайтиПоНаименованию("Основной")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
Формат(Записи.Период, "ДФ=ММММ") + ": " +
Записи.ПришёлТовар + " руб."
);
КонецЦикла;
// ===========================================================
// Пример №3
Сообщить("Пример №3");
// Узнаем сколько денег поступило в кассу от покупателей за 2014 год.
// То есть проанализируем дебетовые обороты между 50.01 и 62.01
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ХозрасчетныйОбороты.Счет,
|
ХозрасчетныйОбороты.КорСчет,
|
ХозрасчетныйОбороты.СуммаОборотДт
|ИЗ
|
РегистрБухгалтерии.Хозрасчетный.Обороты(
|
ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
|
ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59),
|
Период,
|
Счет = &ВыбСчет,
|
,
|
,
|
КорСчет = &ВыбКорСчет
|
) КАК ХозрасчетныйОбороты";
Запрос.УстановитьПараметр("ВыбСчет",
ПланыСчетов.Хозрасчетный.НайтиПоКоду("50.01")
);
Запрос.УстановитьПараметр("ВыбКорСчет",
ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"За 2014 год на " +
Записи.Счет + " с " + Записи.КорСчет + " пришло " +
Записи.СуммаОборотДт + " руб."
);
КонецЦикла;
КонецПроцедуры
/// Как получить остатки по бухгалтерскому счету в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьОстаткиПоСчетуНаСервере()
//
//
//
//
//
//
//
//
//
За получение остатков по бухгалтерским счетам
в разрезе аналитики отвечает виртуальная
таблица Остатки, у неё есть следующие параметры:
1. Период (на который считаем остатки)
2. Условие счета (например, Счет = &ВыбСчет)
3. Субконто (список видов субконто, влияет на доступность
и смысл Субконто1, Субконто2.., которыми можно оперировать
в запросе
4. Условие (например, Субконто1 = &ВыбСклад)
// Найдём остатки товаров на всех складах на конец 2014 года.
// То есть запросим дебетовые остатки по всем счетам,
// входящих в группу 41 счёта в разрезе субконто Номенклатура.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ХозрасчетныйОстатки.Счет,
|
ХозрасчетныйОстатки.Субконто1 КАК Товар,
|
ХозрасчетныйОстатки.КоличествоОстатокДт,
|
ХозрасчетныйОстатки.СуммаОстатокДт
|ИЗ
|
РегистрБухгалтерии.Хозрасчетный.Остатки(
|
ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59),
|
Счет В ИЕРАРХИИ (&ВыбСчет), &ВидыСубконто
|
) КАК ХозрасчетныйОстатки";
Запрос.УстановитьПараметр("ВыбСчет",
ПланыСчетов.Хозрасчетный.НайтиПоКоду("41")
);
ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура
);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Сообщить("Остатки товаров по всем складам на конец 2014 года.");
Пока Записи.Следующий() Цикл
Сообщить(
Записи.Товар.Наименование +
" Количество [" + Записи.КоличествоОстатокДт + " шт.]" +
" Сумма [" + Записи.СуммаОстатокДт + " руб.]"
);
КонецЦикла;
КонецПроцедуры
/// Как получить сразу остатки и обороты по бухгалтерскому счету
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьСразуОстаткиИОборотыПоСчетуНаСервере()
//
//
//
//
//
//
//
//
//
//
//
//
За получение остатков и обротов за произвольный период
с заданной периодичностью в разрезе аналитики отвечает
виртуальная таблица ОстаткиИОбороты, у неё есть параметры:
1. Начало периода
2. Конец периода
3. Периодичность (например, Период, Год, Месяц...)
4. Метод дополнения периодов (Движение или ДвиженияИГраницыПериода)
5. Условие счета (например, Счет = &ВыбСчет)
6. Субконто (список видов субконто, влияет на доступность
и смысл Субконто1, Субконто2.., которыми можно оперировать
в запросе
7. Условие (например, Субконто1 = &ВыбТовар)
// Для примера получим начальный остаток, приход, расход, и
// конечный остаток банана на всех складах за каждый месяц
// 2014 года.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ХозрасчетныйОстаткиИОбороты.Период,
|
ХозрасчетныйОстаткиИОбороты.Счет,
|
ХозрасчетныйОстаткиИОбороты.Субконто1,
|
ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстатокДт,
|
ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт,
|
ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт,
|
ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстатокДт
|ИЗ
|
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
|
ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
|
ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59),
|
Месяц, ДвиженияИГраницыПериода,
|
Счет В ИЕРАРХИИ (&ВыбСчет), &ВидыСубконто,
|
Субконто1 = &ВыбТовар
|
) КАК ХозрасчетныйОстаткиИОбороты";
Запрос.УстановитьПараметр("ВыбСчет",
ПланыСчетов.Хозрасчетный.НайтиПоКоду("41")
);
ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура
);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
Запрос.УстановитьПараметр("ВыбТовар",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(Формат(Записи.Период, "ДФ=ММММ") + ": ");
Сообщить(
Строка(Записи.Счет) + " " + Записи.Субконто1 + " " +
"Нач. остаток " + Записи.КоличествоНачальныйОстатокДт +
" приход " + Записи.КоличествоОборотДт + ", расход " +
Записи.КоличествоОборотКт + " Кон. остаток " +
Записи.КоличествоКонечныйОстатокДт
);
КонецЦикла;
КонецПроцедуры
/// Как найти и изменить программно бухгалтерские проводки
/// документа в 1с 8.3, 8.2
&НаСервере
Процедура КакНайтиИИзменитьПроводкиДокументаНаСервере()
// предположим у нас есть ссылка на проведенный
// документ поступления еды № ВМБП-000002
ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231');
//
//
//
//
мы знаем, что этот документ делает следующие
проводки по регистру бухгалтерии "Хозрасчетный":
- Дт 41.01 Кт 60.01
- Дт 60.01 Кт 50.01
// наша задача: найти эти проводки бухгалтерские проводки
// и изменить их (например, удвоим количество по дебету 41.01)
// и записать вместо старых
// используем объектную технику получения проводок,
// ведь мы будем их изменять
Поступление = ПоступлениеСсылка.ПолучитьОбъект();
// получим набор проводок этого документа в регистр "Хозрасчетный"
НаборПроводок = Поступление.Движения.Хозрасчетный;
// прочитаем проводки из базы данных
НаборПроводок.Прочитать();
Для Каждого Проводка Из НаборПроводок Цикл
// выведем старые значения
Сообщить(
"Дт " + Проводка.СчетДт + " (" + Проводка.КоличествоДт + " шт.) "
+
"Кт " + Проводка.СчетКт + " (" + Проводка.КоличествоКт + " шт.) "
+
Проводка.Сумма + " руб."
);
Если
Проводка.СчетДт =
ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01")
Тогда
// эта проводка в дебет 41 счёта
// изменим её, удвоив количество по дебету
Проводка.КоличествоДт = Проводка.КоличествоДт * 2;
КонецЕсли;
КонецЦикла;
// добавим новую проводку
НоваяПроводка = НаборПроводок.Добавить();
// дт
НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
НоваяПроводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Скл
ады] =
Справочники.Склады.НайтиПоНаименованию("Основной");
НоваяПроводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Ном
енклатура] =
Справочники.Номенклатура.НайтиПоНаименованию("Банан");
НоваяПроводка.КоличествоДт = 333;
// кт
НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01");
НоваяПроводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Кон
трагенты] =
Справочники.Контрагенты.НайтиПоНаименованию("ООО ""Африка""");
// общая часть
НоваяПроводка.Период = ТекущаяДата();
НоваяПроводка.Организация =
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""");
НоваяПроводка.Сумма = 5000;
НоваяПроводка.Содержание = "Проводка добавлена программно.";
// разом запишем набор проводок
НаборПроводок.Записать(
Истина // удалим старые проводки и запишем вместо них новые
);
//
//
//
//
теперь бухгалтерские проводки документа № ВМБП-000002,
отличаются от тех, что были записаны документом при проведении
чтобы вернуть их к начальному виду - нужно
перепровести документ
КонецПроцедуры
/// Как прочитать бухгалтерские проводки документа запросом в 1с 8.3, 8.2
&НаСервере
Процедура КакПрочитатьПроводкиДокументаЗапросомНаСервере()
// этот приём используется, если не требуется изменять
// найденные проводки
// предположим у нас есть ссылка на проведенный
// документ поступления еды № ВМБП-000002
ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231');
// мы знаем, что этот документ делает проводки по
// регистру бухгалтерии "Хозрасчетный"
// прочитаем проводкипо регистру "Хозрасчетный" запросом
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Хозрасчетный.СчетДт,
|
Хозрасчетный.СчетКт,
|
Хозрасчетный.Сумма
|ИЗ
|
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
|
Хозрасчетный.Регистратор = &ВыбРегистратор
|
|УПОРЯДОЧИТЬ ПО
|
Хозрасчетный.НомерСтроки";
Запрос.УстановитьПараметр("ВыбРегистратор", ПоступлениеСсылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(
"Дт " + ВыборкаДетальныеЗаписи.СчетДт +
" Кт " + ВыборкаДетальныеЗаписи.СчетКт +
" " + ВыборкаДетальныеЗаписи.Сумма + " руб."
);
КонецЦикла;
КонецПроцедуры
/// Как создать бухгалтерские проводки без привязки
/// к документу в 1с 8.3, 8.2
&НаСервере
Процедура КакСоздатьПроводкиБезДокументаНаСервере()
// в нашей тестовой конфигурации нет документа
// "ОперацияБух", который присутствует во всех
// типовых
Сообщить("Этот пример нельзя выполнить в этой базе.");
Возврат;
//
//
//
//
бухгалтерские проводки обязательно должны быть к
привязаны к документу, в данном случае этим документом
будет документ "ОперацияБух", задуманный как раз для
ручных бухгалтерских операций
// создаём и записываем пустой документ
// пока без бухгалтерских проводок
Операция = Документы.ОперацияБух.СоздатьДокумент();
Операция.Дата = ТекущаяДата();
Операция.Организация =
Справочники.Организации.НайтиПоНаименованию("Ромашка");
Операция.СуммаОперации = 1000;
Операция.Содержание = "Ручная операция по 41 счёту";
Операция.Записать(РежимЗаписиДокумента.Запись);
// затем получаем его набор проводок (пустой)
// заполняем его и записываем
НаборПроводок = Операция.Движения.Хозрасчетный;
Проводка = НаборПроводок.Добавить();
Проводка.Период = Операция.Дата;
Проводка.Организация = Операция.Организация;
// дт
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
Проводка.СубконтоДт[
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура
] = Справочники.Номенклатура.НайтиПоНаименованию("Банан");
На41ВедетсяУчетПоСкладам = Проводка.СчетДт.ВидыСубконто.Найти(
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады
) <> Неопределено;
Если На41ВедетсяУчетПоСкладам Тогда
Проводка.СубконтоДт[
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады
] = Справочники.Склады.НайтиПоНаименованию("Основной");
КонецЕсли;
Проводка.КоличествоДт = 3;
// кт
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01");
Проводка.СубконтоКт[
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты
] = Справочники.Контрагенты.НайтиПоНаименованию("Беркут");
// общее
Проводка.Сумма = 500;
НаборПроводок.Записать(Истина);
КонецПроцедуры
/// Как получить информацию о бухгалтерском счёте
/// из плана счетов в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьИнформациюОСчетеНаСервере()
// читаем информацию о счёте из плана счетов
// находим счёт по коду
Счёт41_1 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
// смотрим состав субконто
Для Каждого Субконто Из Счёт41_1.ВидыСубконто Цикл
Сообщить("Субконто " + Субконто.ВидСубконто.Наименование);
Сообщить(" Валютный " + Субконто.Валютный);
Сообщить(" Количественный " + Субконто.Количественный);
Сообщить(" Суммовой " + Субконто.Суммовой);
КонецЦикла;
// узнаем, ведётся ли на 41.01 учёт по складам
// (другими словами есть ли у этого счёта субконто
// склады)
Если Счёт41_1.ВидыСубконто.Найти(
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады
) <> Неопределено Тогда
Сообщить("На 41.01 ведётся учёт по складам.");
Иначе
Сообщить("На 41.01 ведётся учёт по складам не ведётся.");
КонецЕсли;
// узнаем является ли один счёт родителем другого
Счёт41 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41");
Если Счёт41_1.ПринадлежитЭлементу(Счёт41) Тогда
Сообщить(Счёт41.Код + " является родителем для " +
Счёт41_1.Код);
КонецЕсли;
КонецПроцедуры
Регистры накопления
Описание:
Регистры накопления в системе 1С:Предприятие используются для накопления информации
о наличии и движении средств - товарных, денежных и других. Информация о
хозяйственных операциях в регистры накопления вводится с использованием документов
(регистраторов) и используется, например, для получения отчетных форм.
Регистр накопления представляет собой n-мерную систему координат, в узлах которой
хранятся совокупные данные. Оси такой системы координат будем называть измерениями
регистра, а хранящиеся в узлах данные - ресурсами регистра. Содержимое регистра
накопления можно представить в виде таблицы с количеством колонок, равным сумме
измерений и ресурсов регистра накопления.
Помимо измерений и ресурсов, для регистра накопления может быть создан набор
реквизитов. Реквизиты позволяют включать в движения регистров различную
дополнительную информацию. Реквизиты не влияют на значения ресурсов регистра и могут
использоваться для анализа движений регистра.
В системе 1С:Предприятие возможно использование регистров накопления двух типов:
регистры остатков и регистры оборотов. Для регистра остатков методы встроенного языка
позволяют получить остатки регистра накопления на заданный момент времени. Есть
возможность фильтрации по значениям измерений, а также получения остатков в разрезе
других измерений. Регистры оборотов предназначены для хранения информации, для
которой понятие остатка лишено смысла, например, сумм продаж в разрезе покупателей.
В программных модулях для общих действий над регистром накопления (получение остатков
и оборотов по данным регистра накопления, поиска нужных записей, формирования
выборок, создания форм и макетов) служит объект РегистрНакопленияМенеджер.<Имя
регистра накопления>. Для считывания и занесения набора записей в базу данных по
определенному условию отбора служит объект РегистрНакопленияНаборЗаписей.<Имя
регистра накопления> Для динамического обхода записей регистра служит
объект РегистрНакопленияВыборка.<Имя регистра накопления>.
/// Как прочитать записи регистра накопления в 1с 8.3, 8.2
&НаСервере
Процедура КакПрочитатьЗаписиРегистраНакопленияНаСервере()
// Получим все записи регистра накопления ЗаказыКлиентов
// по организации ООО "Ромашка" за 1 квартал 2014 года,
// упорядочив их по возрастанию даты.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЗаказыКлиентов.Период,
|
ЗаказыКлиентов.Регистратор,
|
ЗаказыКлиентов.НомерСтроки,
|
ЗаказыКлиентов.Активность,
|
ЗаказыКлиентов.Контрагент,
|
ЗаказыКлиентов.Номенклатура,
|
ЗаказыКлиентов.Количество
|ИЗ
|
РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
|ГДЕ
|
ЗаказыКлиентов.Активность = Истина И
|
ЗаказыКлиентов.Организация = &ВыбОрганизация И
|
ЗаказыКлиентов.Период МЕЖДУ &НачДата И &КонДата
|УПОРЯДОЧИТЬ ПО
|
ЗаказыКлиентов.Период";
Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
// начальная дата - 1 января 2014 года
Запрос.УстановитьПараметр("НачДата", '20140101000000');
// конечная дата - 31 марта 2014 года 23 часа 59 минут 59 секунд
Запрос.УстановитьПараметр("КонДата", '20140331235959');
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Период + "] " +
Записи.Номенклатура + " " +
Записи.Количество + " шт." +
" (" + Записи.Регистратор + ")"
);
КонецЦикла;
КонецПроцедуры
/// Как получить обороты по регистру накопления в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьОборотыПоРегиструНапопленияНаСервере()
//
//
//
//
//
//
//
//
За получение оборотов по регистру накопления за произвольный период
с заданной периодичностью в различных разрезах аналитики отвечает
виртуальная таблица Обороты,
у неё есть следующие параметры:
1. Начало периода (включая)
2. Конец периода (включая)
3. Периодичность (например, Период, Запись, Год, Месяц...)
4. Условие (например, Организация = &ВыбОрганизация)
// Пример №1
Сообщить("Пример №1");
// Посчитаем сколько и каких продуктов было заказано за 1 квартал
// 2014 года в организации ООО "Ромашка".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЗаказыКлиентовОбороты.Номенклатура,
|
ЗаказыКлиентовОбороты.Организация,
|
ЗаказыКлиентовОбороты.КоличествоОборот
|ИЗ
|
РегистрНакопления.ЗаказыКлиентов.Обороты(
|
ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
|
ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59),
|
Период,
|
Организация = &ВыбОрганизация
|
) КАК ЗаказыКлиентовОбороты
|УПОРЯДОЧИТЬ ПО
|
ЗаказыКлиентовОбороты.Номенклатура";
Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"За 1 кв. 2014 года заказали " +
Записи.КоличествоОборот + " шт. " +
Записи.Номенклатура
);
КонецЦикла;
// Пример №2
Сообщить("Пример №2");
// Посчитаем сколько бананов было заказано за каждый месяц
// в 1 квартале 2014 года в организации "Ромашка".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЗаказыКлиентовОбороты.Период,
|
ЗаказыКлиентовОбороты.Номенклатура,
|
ЗаказыКлиентовОбороты.Организация,
|
ЗаказыКлиентовОбороты.КоличествоОборот
|ИЗ
|
РегистрНакопления.ЗаказыКлиентов.Обороты(
|
&НачПериод,
|
&КонПериод,
|
Месяц,
|
Организация = &ВыбОрганизация И
|
Номенклатура = &ВыбНоменклатура
|
) КАК ЗаказыКлиентовОбороты
|УПОРЯДОЧИТЬ ПО
|
ЗаказыКлиентовОбороты.Период";
Запрос.УстановитьПараметр("НачПериод", '20140101000000');
Запрос.УстановитьПараметр("КонПериод", '20140331235959');
Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"За " + Формат(Записи.Период, "ДФ=ММММ") +
" заказали " + Записи.КоличествоОборот + " шт. " +
Записи.Номенклатура
);
КонецЦикла;
КонецПроцедуры
/// Как получить остатки по регистру накопления в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьОстаткиПоРегиструНакопленияНаСервере()
//
//
//
//
//
//
//
За получение остатков по регистру накопления в разрезе
аналитики отвечает виртуальная таблица Остатки,
у неё есть следующие параметры:
1. Период, на который считаем остатки, исключая саму дату.
Если нужны остатки на дату включительно - используем
тип Граница (см. пример ниже).
2. Условие (например, Организация = &ВыбОрганизация)
// Получим остатки бананов на основном складе в организации
// ООО "Ромашка" на 31 марта 2014 года (включительно)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЗапасыЕдыОстатки.Склад,
|
ЗапасыЕдыОстатки.Номенклатура,
|
ЗапасыЕдыОстатки.Организация,
|
ЗапасыЕдыОстатки.КоличествоОстаток
|ИЗ
|
РегистрНакопления.ЗапасыЕды.Остатки(
|
&ВыбДата,
|
Склад = &ВыбСклад И
|
Номенклатура = &ВыбНоменклатура
|
) КАК ЗапасыЕдыОстатки";
Запрос.УстановитьПараметр("ВыбДата",
Новый Граница('20140331235959', ВидГраницы.Включая)
);
Запрос.УстановитьПараметр("ВыбСклад",
Справочники.Склады.НайтиПоНаименованию("Основной")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"Остатки " + " " + Записи.Номенклатура +
" на складе " + Записи.Склад + " на дату " +
"31.03.2014 (включительно) " +
" составляют " + Записи.КоличествоОстаток + " шт.");
КонецЦикла;
КонецПроцедуры
/// Как получить сразу остатки и обороты по регистру
/// накопления в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьСразуОстаткиИОборотыПоРегиструНакопленияНаСервере()
//
//
//
//
//
За получение остатков и оборотов за произвольный период
с заданной периодичностью в разрезе аналитики отвечает
виртуальная таблица ОстаткиИОбороты, у неё есть параметры:
1. Начало периода (включая)
2. Конец периода (включая)
// 3. Периодичность (например, Период, Год, Месяц...)
// 4. Метод дополнения периодов (Движение или ДвиженияИГраницыПериода)
// 5. Условие (например, Организация = &ВыбОрганизация)
// Для примера получим начальный остаток, приход, расход и конечный остаток
// банана на всех складах за каждый месяц 2014 года для
// организация ООО "Ромашка".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЗапасыЕдыОстаткиИОбороты.Период,
|
ЗапасыЕдыОстаткиИОбороты.Номенклатура,
|
ЗапасыЕдыОстаткиИОбороты.Организация,
|
ЗапасыЕдыОстаткиИОбороты.КоличествоНачальныйОстаток,
|
ЗапасыЕдыОстаткиИОбороты.КоличествоОборот,
|
ЗапасыЕдыОстаткиИОбороты.КоличествоПриход,
|
ЗапасыЕдыОстаткиИОбороты.КоличествоРасход,
|
ЗапасыЕдыОстаткиИОбороты.КоличествоКонечныйОстаток
|ИЗ
|
РегистрНакопления.ЗапасыЕды.ОстаткиИОбороты(
|
ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
|
ДАТАВРЕМЯ(2014, 12, 31, 23, 59, 59),
|
Месяц, ДвиженияИГраницыПериода,
|
Организация = &ВыбОрганизация И
|
Номенклатура = &ВыбНоменклатура
|
) КАК ЗапасыЕдыОстаткиИОбороты
|УПОРЯДОЧИТЬ ПО
|
ЗапасыЕдыОстаткиИОбороты.Период";
Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
Формат(Записи.Период, "ДФ=ММММ") + " [" +
Записи.Номенклатура + "] " + "нач. остаток " +
Записи.КоличествоНачальныйОстаток + " приход " +
Записи.КоличествоПриход + ", расход " +
Записи.КоличествоРасход + " кон. остаток " +
Записи.КоличествоКонечныйОстаток
);
КонецЦикла;
КонецПроцедуры
/// Как найти и изменить программно записи в регистр накопления
/// документа (регистратора) в 1с 8.3, 8.2
&НаСервере
Процедура КакНайтиИИзменитьЗаписиДокументаНаСервере()
// Предположим у нас есть ссылка на проведенный документ
// поступления еды № ВМБП-000002
ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231'
);
// Мы значем, что этот документ делает следующие записи
// в регистр накопления "ЗапасыЕды":
// Приход [Организация, Склад, Номенклатура] [Количество]
// Наша задача: найти эти записи и изменить
// их (например, удвоим количество поступившего товара)
// и записать вместо старых.
// Используем объектную технику получения записей,
// ведь мы будем их изменять.
Поступление = ПоступлениеСсылка.ПолучитьОбъект();
// Получим набор записей этого документа в регистр "ЗапасыЕды".
НаборЗаписей = Поступление.Движения.ЗапасыЕды;
// Прочитаем записи из базы данных.
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// Выведем старые значения.
Сообщить(
"[" + Запись.Организация + ", " +
Запись.Склад + ", " +
Запись.Номенклатура + "] " +
"[" + Запись.Количество + "]"
);
// Удвоим количество.
Запись.Количество = 2 * Запись.Количество;
КонецЦикла;
// Добавим новую запись в регистр накопления.
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Организация =
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""");
НоваяЗапись.Склад =
Справочники.Склады.НайтиПоНаименованию("Основной");
НоваяЗапись.Номенклатура =
Справочники.Номенклатура.НайтиПоНаименованию("Банан");
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Количество = 1000;
// Разом запишем набор записей.
НаборЗаписей.Записать(
Истина // удалим старые записи и запишем вместо них новые
);
//
//
//
//
Теперь записи регистра ЗапасыЕды по документу № ВМБП-000002,
отличаются от тех, что были записаны документом при проведении.
Чтобы вернуть их к начальному виду - нужно
перепровести документ.
КонецПроцедуры
/// Как прочитать записи документа в регистр накопления
/// запросом в 1с 8.3, 8.2
&НаСервере
Процедура КакПрочитатьЗаписиДокументаЗапросомНаСервере()
// Этот приём используется, если не требуется изменять
// найденные записи.
// Предположим у нас есть ссылка на проведенный документ
// поступления еды № ВМБП-000002
ПоступлениеСсылка =
Документы.ПоступлениеЕды.НайтиПоНомеру(
"ВМБП-000002", '20141231'
);
// Мы значем, что этот документ делает записи
// в регистр накопления "ЗапасыЕды".
// Прочитаем эти записи запросом.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЗапасыЕды.Период,
|
ЗапасыЕды.Регистратор,
|
ЗапасыЕды.НомерСтроки,
|
ЗапасыЕды.Активность,
|
ЗапасыЕды.ВидДвижения,
|
ЗапасыЕды.Склад,
|
ЗапасыЕды.Номенклатура,
|
ЗапасыЕды.Организация,
|
ЗапасыЕды.Количество
|ИЗ
|
РегистрНакопления.ЗапасыЕды КАК ЗапасыЕды
|ГДЕ
|
ЗапасыЕды.Регистратор = &ВыбРегистратор
|УПОРЯДОЧИТЬ ПО
|
ЗапасыЕды.НомерСтроки";
Запрос.УстановитьПараметр(
"ВыбРегистратор",
ПоступлениеСсылка
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Организация + ", " +
Записи.Склад + ", " +
Записи.Номенклатура + "] " +
"[" + Записи.Количество + "]"
);
КонецЦикла;
КонецПроцедуры
/// Как создать записи регистра накопления без привязки
/// к документу в 1с 8.3, 8.2
&НаСервере
Процедура КакСоздатьЗаписиБезДокументаНаСервере()
// В нашей тестовой конфигурации нет документа
// "ОперацияБух", который присутствует в бухгалтерской базе.
Сообщить("Этот пример нельзя выполнить в этой базе.");
Возврат;
//
//
//
//
Записи регистра накопления обязательно
должны быть привязаны к документу, в данном случае
этим документом будет документ "ОперацияБух",
задуманный как раз для ручных операций.
Операция = Документы.ОперацияБух.СоздатьДокумент();
Операция.Дата = ТекущаяДата();
Операция.Организация =
Справочники.Организации.НайтиПоНаименованию("Милькин В. В. ИП");
Операция.СуммаОперации = 1000;
Операция.Содержание = "Ручная операция по регистру накопления ИПДоходы";
Операция.Записать(РежимЗаписиДокумента.Запись);
// Затем получаем его набор записей для регистра ИПДоходы
НаборЗаписей = Операция.Движения.ИПДоходы;
Запись = НаборЗаписей.Добавить();
Запись.Период = Операция.Дата;
Запись.Организация = Операция.Организация;
// и т.д. заполняем все нужные поля регистра
Запись.Сумма = 1000;
НаборЗаписей.Записать(Истина);
КонецПроцедуры
Регистры сведений
Описание:
Основная задача регистра сведений - хранить существенную для прикладной задачи
информацию, состав которой развернут по определенной комбинации значений и, при
необходимости, развернут во времени. Регистры сведений информация в которых развернута
во времени, называются периодическими.
Например, если мы хотим хранить информацию о ценах конкурентов на продаваемые нами
товары, то собранная информация о ценах разворачивается по товарам и конкурентам. А
если мы хотим отслеживать динамику изменений цен, и будем заносить их периодически, то
хранимая информация разворачивается также и во времени.
Регистр сведений, фактически, представляет собой массив данных, необходимый, чтобы
реализовать функцию, которая может выдать необходимую информацию по определенному
набору аргументов. Аргументы функции называются измерениями, а результат функции ресурсами. В приведенном выше примере регистр "ЦеныКонкурентов" будет содержать
измерения "Конкурент" и "Товар", и ресурс "Цена". Ресурсов может быть больше чем один:
например, можно хранить оптовую и розничную цены.
Для разворота этой информации во времени используется поле "Период" регистра. Оно не
вносится в качестве измерения, а добавляется системой автоматически при создании
периодического регистра.
Для периодических регистров сведений система поддерживает такие стандартные операции,
как получение наиболее позднего или наиболее раннего значения по определенной
комбинации измерений (например, получение последней введенной цены по конкретному
товару и конкретному конкуренту), а также получения среза наиболее поздних или ранних
значений. Например, могут быть получены все последние введенные цены по различным
товарам и конкурентам.
Если регистр не периодический, то поле "Период" для него не создается. В приведенном
примере регистр "ЦеныКонкурентов" может быть непериодическим, если мы не хотим
хранить историю изменения цен, а хотим иметь только актуальные цены. Тогда функция
регистра сможет ответить на вопрос "какая сейчас цена у такого-то конкурента на такой-то
товар", но не сможет ответить на вопрос "какая была цена у такого-то конкурента на такой-то
товар в начале года".
Из описанных принципов работы регистра сведений вытекает то, что в системе может быть
только одна запись с определенным набором и периодом измерений.
Действительно, по одному товару по одному конкуренту может быть только одна цена. Если
по какой-либо причине мы можем получить несколько цен и хотим занести эту информацию
в базу данных, то нам нужно создать еще одно измерение для хранения того значения, по
которому эти цены могут различаться. Например, можно завести измерение
"ИсточникИнформации". Тогда можно будет вводить цены конкурентов в разрезе
источников.
Уникальность записей по набору измерений принципиально отличает регистры сведений от
регистров накоплений, которые позволяют вводить несколько записей с одинаковым
значением измерений и периодом.
Строки регистра сведений, содержащие информацию о значениях ресурсов для
определенных значений измерений и конкретного периода, называются записями. Записи в
регистр сведений можно вносить двумя способами: вручную или документами.
Эти два варианта влияют на способ внесения информации, а не на основную логику работы
регистра.
Документ, которым вносится запись в регистр сведений, называется регистратором.
Регистры, записываемые независимо, могут свободно редактироваться вручную или
средствами встроенного языка. При этом если измерение такого регистра назначено как
"ведущее" и значением измерения является ссылка на объект базы данных, то будет
считаться, что запись регистра имеет смысл, только пока существует этот объект. Например,
если назначить ведущим измерение "Конкурент", то считается, что запись имеет смысл
только как информация по данному конкуренту. Соответственно, при удалении конкурента
записи по нему будут удалены автоматически.
Если регистр записывается регистратором, то это значит, что записи будут жестко подчинены
регистраторам - документам. Обычно это значит, что записи будут порождаться при
проведении документов. Соответственно, при удалении документа записи будут удаляться
автоматически. В отличие от ведущих измерений, регистратор может быть только один.
В программных модулях для общих действий над регистром сведений (поиск, выбор и
создание записей регистра) служит объект РегистрСведенийМенеджер.<Имя регистра
сведений>. Для чтения, записи и удаления отдельных записей регистра сведений, не
управляемого регистраторами, служит объект РегистрСведенийМенеджерЗаписи.<Имя
регистра сведений>. Для считывания и занесения набора записей в базу данных по
определенному условию отбора служит объект РегистрСведенийНаборЗаписей.<Имя
регистра сведений>. Для динамического обхода записей регистра служит
объект РегистрСведенийВыборка.<Имя регистра сведений>.
/// Как прочитать записи регистра сведений
&НаСервере
Процедура КакПрочитатьЗаписиРегистраСведенийНаСервере()
// Прочитаем все записи регистра сведений "ЦенаНаЕдуДляКлиентов"
// для организации ООО "Ромашка", упорядоченные по дате.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЦенаНаЕдуДляКлиентов.Период,
|
ЦенаНаЕдуДляКлиентов.Регистратор,
|
ЦенаНаЕдуДляКлиентов.НомерСтроки,
|
ЦенаНаЕдуДляКлиентов.Активность,
|
ЦенаНаЕдуДляКлиентов.Номенклатура,
|
ЦенаНаЕдуДляКлиентов.Контрагент,
|
ЦенаНаЕдуДляКлиентов.Организация,
|
ЦенаНаЕдуДляКлиентов.Цена
|ИЗ
|
РегистрСведений.ЦенаНаЕдуДляКлиентов КАК ЦенаНаЕдуДляКлиентов
|ГДЕ
|
ЦенаНаЕдуДляКлиентов.Активность = Истина И
|
ЦенаНаЕдуДляКлиентов.Организация = &ВыбОрганизация
|УПОРЯДОЧИТЬ ПО
|
ЦенаНаЕдуДляКлиентов.Период";
Запрос.УстановитьПараметр(
"ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Период + "] " +
Записи.Контрагент + " " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);
КонецЦикла;
КонецПроцедуры
/// Как получить наиболее поздние записи (срез последних)
/// регистра сведений на указанную дату (включительно)
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакПолучитьНаиболееПоздниеЗаписиРегистраСведенийНаСервере()
//
//
//
//
//
//
За возможности выборки наиболее поздних записей регистра
сведений (среза последних) в разрезе заданной аналитики
отвечает виртуальная таблица СрезПоследних.
У неё есть следующие параметры:
1. Период (включительно)
2. Условие (например, Организация = &ВыбОрганизация)
// Получим цены на бананы для каждого контрагента
// на конец 1 квартала 2014 года (включительно)
// по организации ООО "Ромашка".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЦенаНаЕдуДляКлиентовСрезПоследних.Период,
|
ЦенаНаЕдуДляКлиентовСрезПоследних.Активность,
|
ЦенаНаЕдуДляКлиентовСрезПоследних.Номенклатура,
|
ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент,
|
ЦенаНаЕдуДляКлиентовСрезПоследних.Организация,
|
ЦенаНаЕдуДляКлиентовСрезПоследних.Цена
|ИЗ
|
РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПоследних(
|
ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59),
|
Активность = Истина И
|
Организация = &ВыбОрганизация И
|
Номенклатура = &ВыбНоменклатура
|
) КАК ЦенаНаЕдуДляКлиентовСрезПоследних
|УПОРЯДОЧИТЬ ПО
|
ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент";
Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Контрагент + ", " + Записи.Период + "] " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);
КонецЦикла;
КонецПроцедуры
/// Как получить наиболее ранние записи (срез первых)
/// регистра сведений на указанную дату (включительно)
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакПрочитатьНаиболееРанниеЗаписиРегистраСведенийНаСервере()
//
//
//
//
//
За возможности выборки наиболее ранних записей регистра
сведений (среза первых) в разрезе заданной аналитики
отвечает виртуальная таблица СрезПервых.
У неё есть следующие параметры:
1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)
// ! Нужно внимательно вдуматься. СрезПервых получает по каждой
// комбинации измерений наиболее раннюю запись, но НЕ БОЛЕЕ
// РАННЮЮ, чем указанная дата.
// Получим самые первые цены, которые были установлены на бананы
// для каждого контрагента в 2014 году (включительно)
// по организации ООО "Ромашка".
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЦенаНаЕдуДляКлиентовСрезПервых.Период,
|
ЦенаНаЕдуДляКлиентовСрезПервых.Активность,
|
ЦенаНаЕдуДляКлиентовСрезПервых.Номенклатура,
|
ЦенаНаЕдуДляКлиентовСрезПервых.Контрагент,
|
ЦенаНаЕдуДляКлиентовСрезПервых.Организация,
|
ЦенаНаЕдуДляКлиентовСрезПервых.Цена
|ИЗ
|
РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПервых(
|
ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
|
Активность = Истина И
|
Организация = &ВыбОрганизация И
|
Номенклатура = &ВыбНоменклатура
|
) КАК ЦенаНаЕдуДляКлиентовСрезПервых
|УПОРЯДОЧИТЬ ПО
|
ЦенаНаЕдуДляКлиентовСрезПервых.Контрагент";
Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Контрагент + ", " + Записи.Период + "] " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);
КонецЦикла;
КонецПроцедуры
/// Как найти и изменить програмно записи в регистр сведений
/// документа в 1с 8.3, 8.2
&НаСервере
Процедура КакНайтиИИзменитьЗаписиДокументаНаСервере()
// Предположим, у нас есть ссылка на проведенный документ
// "Установка цен на еду" № ВМБП-000001
УстановкаЦенСсылка =
Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру(
"ВМБП-000001", '20141231'
);
// Мы знаем, что этот документ делает записи в регистр
// сведений "ЦенаНаЕдуДляКлиентов":
// [Организация, Контрагент, Номенклатура] [Цена]
// Наша задача: найти эти записи и изменит их (например, удвоим
// цену) и записать вместо старых.
// Используем объектную технику получения записей,
// ведь мы будем их изменять.
УстановкаЦен = УстановкаЦенСсылка.ПолучитьОбъект();
// Получим набор записей этого документа в регистр
// "ЦенаНаЕдуДляКлиентов"
НаборЗаписей = УстановкаЦен.Движения.ЦенаНаЕдуДляКлиентов;
// Прочитаем записи из базы данных.
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// Выведем старые значения.
Сообщить(
"[" + Запись.Организация + ", " +
Запись.Контрагент + ", " +
Запись.Номенклатура + "] " +
"[" + Запись.Цена + "]"
);
Запись.Цена = Запись.Цена * 2;
КонецЦикла;
// Добавим новую запись.
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Организация =
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""");
НоваяЗапись.Контрагент =
Справочники.Контрагенты.НайтиПоНаименованию("Петров Ю.В.");
НоваяЗапись.Номенклатура =
Справочники.Номенклатура.НайтиПоНаименованию("Банан");
НоваяЗапись.Цена = 500;
// Разом запишем набор записей.
НаборЗаписей.Записать(
Истина // Удалим старые записи и запишем вместо них новые.
);
//
//
//
//
Теперь записи регистра "ЦенаНаЕдуДляКлиентов" для документа
№ ВМБП000001, отличаются от тех, что были записаны
документом при проведении. Чтобы вернуть их к начальному виду
нужно заново провести документ.
КонецПроцедуры
/// Как прочитать записи документа в регистр сведений запросом
/// в 1с 8.3, 8.2
&НаСервере
Процедура КакПрочитатьЗаписиДокументаЗапросомНаСервере()
// Этот прием используется, если не требуется изменять
// найденные записи.
// Предположим, у нас есть ссылка на проведенный документ
// "Установка цен на еду" № ВМБП-000001
УстановкаЦенСсылка =
Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру(
"ВМБП-000001", '20141231'
);
// Мы знаем, что этот документ делает записи в регистр
// сведений "ЦенаНаЕдуДляКлиентов".
// Прочитаем эти записи запросом.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
ЦенаНаЕдуДляКлиентов.Период,
|
ЦенаНаЕдуДляКлиентов.Регистратор,
|
ЦенаНаЕдуДляКлиентов.НомерСтроки,
|
ЦенаНаЕдуДляКлиентов.Активность,
|
ЦенаНаЕдуДляКлиентов.Номенклатура,
|
ЦенаНаЕдуДляКлиентов.Контрагент,
|
ЦенаНаЕдуДляКлиентов.Организация,
|
ЦенаНаЕдуДляКлиентов.Цена
|ИЗ
|
РегистрСведений.ЦенаНаЕдуДляКлиентов КАК ЦенаНаЕдуДляКлиентов
|ГДЕ
|
ЦенаНаЕдуДляКлиентов.Регистратор = &ВыбРегистратор
|УПОРЯДОЧИТЬ ПО
|
ЦенаНаЕдуДляКлиентов.НомерСтроки";
Запрос.УстановитьПараметр(
"ВыбРегистратор",
УстановкаЦенСсылка
);
РезультатЗапроса = Запрос.Выполнить();
Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Организация + ", " +
Записи.Контрагент + ", " +
Записи.Номенклатура + "] " +
"[" + Записи.Цена + "] <" +
Записи.Регистратор + ">"
);
КонецЦикла;
КонецПроцедуры
/// Как создать записи в регистр сведений без привязки к
/// документу в 1с 8.3, 8.2
&НаСервере
Процедура КакСоздатьЗаписиБезПривязкиКДокументуНаСервере()
//
//
//
//
//
//
//
Создавать записи в регистре сведений без привязки
к документу можно только для регистров, у которых
выбран режим записи "Независимый". В нашей конфигурации
таким регистром является "КурсВалют".
Если бы мы захотели проделать такую же штуку для
регистра "ЦенаНаЕдуДляКлиентов", то нам бы пришлось
воспользоваться документом "ОперацияБух" или им подобным
// для ручных операций (см. аналогичный пример в регистрах
// накопления).
// Пример №1.
// Для единичных записей удобно пользоваться менеджером
// записей.
НоваяЗапись = РегистрыСведений.КурсВалют.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = '20140101';
НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("Доллар");
НоваяЗапись.Курс = 30;
НоваяЗапись.Записать(
Истина // замещать, если уже есть запись с такими же измерениями
// и таким же периодом
);
// Пример №2.
// При помощи менеджера можно также легко
// менять или удалять единичные записи.
// Найдём, изменим, а затем удалим созданную запись.
Выборка = РегистрыСведений.КурсВалют.Выбрать('20140101', '20140101');
Если Выборка.Следующий() Тогда
Запись = Выборка.ПолучитьМенеджерЗаписи();
// изменим
Запись.Прочитать();
Запись.Курс = 25;
// запишем
Запись.Записать(Истина);
// и тут же удалим
Запись.Удалить();
КонецЕсли;
// Пример №3.
// Если нужно изменить сразу много записей // удобнее всего использовать набор записей.
// Запишем курсы валют за первые 3 дня 2014 года.
Доллар = Справочники.Валюты.НайтиПоНаименованию("Доллар");
НаборЗаписей = РегистрыСведений.КурсВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
Запись01 = НаборЗаписей.Добавить();
Запись01.Период = '20140101';
Запись01.Валюта = Доллар;
Запись01.Курс = 30;
Запись02 = НаборЗаписей.Добавить();
Запись02.Период = '20140102';
Запись02.Валюта = Доллар;
Запись02.Курс = 40;
Запись03 = НаборЗаписей.Добавить();
Запись03.Период = '20140103';
Запись03.Валюта = Доллар;
Запись03.Курс = 60;
// Запишем весь набор разом.
НаборЗаписей.Записать(
Истина // затрём все другие записи по
// доллару (мы установили его в отборе)
);
КонецПроцедуры
Справочники
Описание:
Для работы с постоянной и условно постоянной информацией с некоторым множеством
значений в системе используются объекты типа "Справочник". Обычно справочниками
являются списки материалов, товаров, организаций, валют, сотрудников и др.
Название и структура каждого конкретного справочника определяется при его создании в
конфигураторе. На этапе конфигурирования можно описать, какими свойствами обладает
каждый конкретный справочник.
К настраиваемым свойствам относятся, например, длина и тип кода, количество уровней,
поддержка уникальности кодов, набор реквизитов справочника. Помимо кода и
наименования, механизм работы со справочниками позволяет создавать набор реквизитов
для хранения любой дополнительной информации об элементе справочника.
Оглавление (нажмите, чтобы раскрыть)

























Как обойти все элементы справочника
Как обойти все группы справочника
Как обойти группы вместе с элементами справочника (иерархически)
Как отобрать элементы справочника по родителю (перечислим все элементы группы)
Как отобрать элементы справочника по владельцу (перечислим все договоры контрагента)
Как отобрать элементы справочника по коду, наименованию, и другим реквизитам
Как создать новый элемент справочника
Как создать новую группу справочника
Как перенести элемент справочника в другую группу
Как внести изменения в элемент справочника по ссылке
Как получить и проверить пустую ссылку типа справочник
Как узнать принадлежность элемента справочника группе с учетом уровней иерархии
Как скопировать существующий элемент справочника
Как выяснить уровень вложенности элемента справочника
Как заблокировать элемент справочника перед изменениями
Как заполнить новый элемент справочника на основании
Как пометить на удаление элемент справочника
Как открыть форму существующего элемента справочника по ссылке
Как открыть форму существующей группы справочника по ссылке
Как открыть форму выбора элемента справочника и отследить её закрытие
Как открыть форму выбора группы справочника и отследить её закрытие
Как открыть форму списка справочника и установить отбор по реквизиту
Как открыть форму списка справочника с нужным отображением
Как открыть форму только что созданного, но ещё не записанного элемента справочника
Скачать и выполнить эти примеры на компьютере
/// Как обойти все элементы справочника в 1с 8.3, 8.2
&НаСервере
Процедура КакОбойтиЭлементыСправочникаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Вкусы КАК Вкусы
|ГДЕ
|
ЭтоГруппа = ЛОЖЬ
|УПОРЯДОЧИТЬ ПО
|
Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаВкусов = РезультатЗапроса.Выбрать();
Пока ВыборкаВкусов.Следующий() Цикл
Сообщить(ВыборкаВкусов.Наименование);
КонецЦикла;
КонецПроцедуры
Результат обхода элементов справочника
/// Как обойти все группы справочника в 1с 8.3, 8.2
&НаСервере
Процедура КакОбойтиГруппыСправочникаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Вкусы КАК Вкусы
|ГДЕ
|
ЭтоГруппа = ИСТИНА
|УПОРЯДОЧИТЬ ПО
|
Наименование";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаВкусов = РезультатЗапроса.Выбрать();
Пока ВыборкаВкусов.Следующий() Цикл
Сообщить(ВыборкаВкусов.Наименование);
КонецЦикла;
КонецПроцедуры
Результат обхода групп справочника
/// Как обойти группы вместе с элементами
/// справочника (иерархически) в 1с 8.3, 8.2
&НаСервере
Процедура КакОбойтиГруппыИЭлементыСправочникаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Вкусы КАК Вкусы
|УПОРЯДОЧИТЬ ПО
|
Наименование Иерархия";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаВкусов = РезультатЗапроса.Выбрать();
Пока ВыборкаВкусов.Следующий() Цикл
Отступ = "";
Для Шаг = 0 По ВыборкаВкусов.Уровень() Цикл
Отступ = Отступ + "
";
КонецЦикла;
Сообщить(Отступ + ВыборкаВкусов.Наименование);
КонецЦикла;
КонецПроцедуры
Результат обхода групп и элементов (иерархически) справочника
/// Как отобрать элементы справочника по родителю в 1с 8.3, 8.2
/// (перечислим все элементы группы)
&НаСервере
Процедура КакОтобратьЭлементыСправочникаПоРодителюНаСервере()
// для тестов найдём группу "Любимые" по её имени
СсылкаНаРодителя = Справочники.Вкусы.НайтиПоНаименованию("Любимые");
// перечислим только те элементы справочника, что
// входят в группу "Любимые"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Вкусы КАК Вкусы
|ГДЕ
|
Вкусы.Родитель = &Родитель";
Запрос.УстановитьПараметр("Родитель", СсылкаНаРодителя);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаВкусов = РезультатЗапроса.Выбрать();
Пока ВыборкаВкусов.Следующий() Цикл
Сообщить(ВыборкаВкусов.Наименование);
КонецЦикла;
КонецПроцедуры
Результат отбора элементов по родителю (группе) справочника
/// Как отобрать элементы справочника по владельцу в 1с 8.3, 8.2
/// (перечислим все договоры контрагента)
&НаСервере
Процедура КакОтобратьЭлементыСправочникаПоВладельцуНаСервере()
// для тестов найдём клиента по коду 1 (это Андрей, у него 2 договора)
СсылкаНаКлиента = Справочники.Клиенты.НайтиПоКоду("000000001");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Наименование
|ИЗ
|
Справочник.Договоры КАК Договоры
|ГДЕ
|
Договоры.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", СсылкаНаКлиента);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДоговоров = РезультатЗапроса.Выбрать();
Пока ВыборкаДоговоров.Следующий() Цикл
Сообщить(ВыборкаДоговоров.Наименование);
КонецЦикла;
КонецПроцедуры
Результат отбора элементов справочника по владельцу
/// Как отобрать элементы справочника по коду, наименованию,
/// и другим реквизитам в 1с 8.3, 8.2
&НаСервере
Процедура КакОтобратьЭлементыСправочникаПоРеквизитамНаСервере()
//
//
//
//
сделаем отбор элементов справочника Клиенты
у которых реквизит Пол = Мужской и ЛюбимыйЦвет = Красный
вместо этих реквизитов для отбора можно использовать
Код, Наименование или любой другой реквизит справочника
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Наименование,
|
Пол,
|
ЛюбимыйЦвет
|ИЗ
|
Справочник.Клиенты КАК Клиенты
|ГДЕ
|
Клиенты.ЭтоГруппа = ЛОЖЬ И
|
Клиенты.Пол = &Пол И
|
Клиенты.ЛюбимыйЦвет = &Цвет";
Запрос.УстановитьПараметр("Пол", Перечисления.Пол.Мужской);
Запрос.УстановитьПараметр(
"Цвет",
Справочники.Цвета.НайтиПоНаименованию("Красный")
);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаКлиентов = РезультатЗапроса.Выбрать();
Пока ВыборкаКлиентов.Следующий() Цикл
Сообщить(
ВыборкаКлиентов.Наименование + " " +
ВыборкаКлиентов.Пол + " " +
ВыборкаКлиентов.ЛюбимыйЦвет
);
КонецЦикла;
КонецПроцедуры
Результат отбора элементов справочника по реквизитам
&НаСервере
Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере()
/// Как создать новый элемент справочника в 1с 8.3, 8.2
// создадим новый элемент справочника Города
// с именем Владивосток
Владивосток = Справочники.Города.СоздатьЭлемент();
Владивосток.Наименование = "Владивосток";
Владивосток.Записать();
/// Как создать новую группу справочника в 1с 8.3, 8.2
// создадим новую группу справочника Города
ГородаУМоря = Справочники.Города.СоздатьГруппу();
ГородаУМоря.Наименование = "Города у моря";
ГородаУМоря.Записать();
/// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2
// перенесём созданный Владивосток в группу "Города у моря"
Владивосток.Родитель = ГородаУМоря.Ссылка;
Владивосток.Записать();
/// Как внести изменения в элемент справочника по ссылке
/// в 1с 8.3, 8.2
// найдём город Калькутта
КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию("Калькутта");
Если Не КалькуттаСсылка.Пустая() Тогда
// изменим и запишем численность жителей в городе
Калькутта = КалькуттаСсылка.ПолучитьОбъект();
Калькутта.Численность = 1000000;
Калькутта.Записать();
КонецЕсли;
/// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2
ПустаяСсылка = Справочники.Города.ПустаяСсылка();
Если ПустаяСсылка.Пустая() Тогда
Сообщить("Ссылка действительно пустая.");
КонецЕсли;
/// Как узнать принадлежность элемента справочника группе
/// с учетом уровней иерархии в 1с 8.3, 8.2
ПермьСсылка = Справочники.Города.НайтиПоНаименованию("Пермь");
РоссияСсылка = Справочники.Города.НайтиПоНаименованию("Россия");
// проверим принадлежит ли город Пермь группе Россия
Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда
Сообщить("Элемент Пермь находится в группе Россия.");
КонецЕсли;
/// Как скопировать существующий элемент справочника в 1с 8.3, 8.2
// скопируем элемент Пермь
КопияПерми = ПермьСсылка.Скопировать();
КопияПерми.Наименование = КопияПерми.Наименование + " КОПИЯ";
КопияПерми.УстановитьНовыйКод();
КопияПерми.Записать();
/// Как выяснить уровень вложенности элемента справочника
/// в 1с 8.3, 8.2
Сообщить(КопияПерми.Уровень()); // 1
/// Как заблокировать элемент справочника перед изменениями
/// в 1с 8.3, 8.2
// выполним блокировку элемента справочника
// от изменения другими режимами или пользователями
Пермь = ПермьСсылка.ПолучитьОбъект();
Если Не Пермь.Заблокирован() Тогда
Пермь.Заблокировать();
// тут идёт какой-то долгий алгоритм
// в результате которого мы меняем
// заблокированный элемент
Пермь.Численность = 5000;
Пермь.Записать();
// и только потом освобождаем его
// для других режимов и пользователей
Пермь.Разблокировать();
КонецЕсли;
/// Как заполнить новый элемент справочника на основании
/// в 1с 8.3, 8.2
//
//
//
//
в модуле справочника Города я определил процедуру
ОбработкаЗаполнения, которая обрабатывает ситуации
когда мы заполняем один элемент на основании
данных другого (см. в базе для скачивания)
Хабаровск = Справочники.Города.СоздатьЭлемент();
Хабаровск.Заполнить(
Справочники.Города.НайтиПоНаименованию("Рио-де-Жанейро")
);
Хабаровск.Наименование = "Хабаровск";
Хабаровск.Записать();
/// Как пометить на удаление элемент справочника в 1с 8.3, 8.2
// пометим на удаление только что созданный Хабаровск
Хабаровск.УстановитьПометкуУдаления(
Истина, // пометка удаления
Ложь // включая подчиненные (если речь о группе справочника)
);
// метод Записать вызывать не нужно
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКлиентаПоИмени(Имя)
Возврат Справочники.Клиенты.НайтиПоНаименованию(Имя);
КонецФункции
/// Как открыть форму существующего элемента справочника
/// по ссылке в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда)
СсылкаНаЭлемент = ПолучитьКлиентаПоИмени("Андрей");
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);
ОткрытьФорму(
"Справочник.Клиенты.ФормаОбъекта", // имя формы
ПараметрыФормы // параметры для формы
);
КонецПроцедуры
/// Как открыть форму существующей группы справочника
/// по ссылке в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда)
СсылкаНаГруппу = ПолучитьКлиентаПоИмени("Vip");
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаГруппу);
ОткрытьФорму(
"Справочник.Клиенты.ФормаГруппы", // имя формы
ПараметрыФормы // параметры для формы
);
КонецПроцедуры
/// Как открыть форму выбора элемента справочника и
/// отследить её закрытие в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораЭлемента",
ЭтотОбъект);
ОткрытьФорму(
"Справочник.Клиенты.ФормаВыбора",,,,,,ОповещениеОЗакрытии
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт
Если Результат <> Неопределено Тогда
Сообщить("Был выбран элемент " + Результат);
КонецЕсли;
КонецПроцедуры
/// Как открыть форму выбора группы справочника и
/// отследить её закрытие в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораГруппы",
ЭтотОбъект);
ОткрытьФорму(
"Справочник.Клиенты.ФормаВыбораГруппы",,,,,,ОповещениеОЗакрытии
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт
Если Результат <> Неопределено Тогда
Сообщить("Была выбрана группа " + Результат);
КонецЕсли;
КонецПроцедуры
/// Как открыть форму списка справочника и
/// установить отбор по реквизиту в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда)
// откроем список клиентов, оставив
// только мужчин
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Пол", ПолучитьПеречислениеМужской());
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
ОткрытьФорму(
"Справочник.Клиенты.ФормаСписка",
ПараметрыФормы
);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПеречислениеМужской()
Возврат Перечисления.Пол.Мужской;
КонецФункции
/// Как открыть форму списка справочника с нужным отображением
/// в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда)
// откроем список клиентов с отображением "Список"
ФормаСписка = ПолучитьФорму("Справочник.Клиенты.ФормаСписка");
ФормаСписка.Открыть();
ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список;
КонецПроцедуры
/// Как открыть форму только что созданного, но ещё
/// не записанного элемента справочника в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда)
// получаем форму нового справочника
ФормаНовогоСправочника = ПолучитьФорму(
"Справочник.Еда.ФормаОбъекта",,, Истина);
// делаем копию её данных (так как напрямую их менять
// нельзя)
КопияДанныхФормы = ФормаНовогоСправочника.Объект;
// заполняем эти данные на сервере
ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);
// копируем заполненные данные в исходную форму
КопироватьДанныеФормы(КопияДанныхФормы,
ФормаНовогоСправочника.Объект);
// показываем форму нового заполненного
// элемента справочника пользователю
ФормаНовогоСправочника.Открыть();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
// преобразуем данные формы в документ
Еда = ДанныеФормыВЗначение(ДанныеФормы,
Тип("СправочникОбъект.Еда"));
Еда.Наименование = "Груша";
Еда.Калорийность = 500;
// преобразуем документа обратно в данные формы
ЗначениеВДанныеФормы(Еда, ДанныеФормы);
КонецПроцедуры
ПолучитьФамилиюСИнициалами(1С 8.3, 8.2, уф)
Функция ПолучитьФамилиюСИнициалами(знач ФИО)
ФИОСПереносами = СтрЗаменить(ФИО, " ", Символы.ПС);
ЧастиСтроки = Новый Массив;
Для Индекс = 1 По СтрЧислоСтрок(ФИОСПереносами) Цикл
Стр = СтрПолучитьСтроку(ФИОСПереносами, Индекс);
Если ЗначениеЗаполнено(Стр) Тогда
ЧастиСтроки.Добавить(СокрЛП(Стр));
КонецЕсли;
КонецЦикла;
Результат = "";
Если ЧастиСтроки.Количество() > 0 Тогда
Результат = Результат + ЧастиСтроки[0];
Если ЧастиСтроки.Количество() > 1 Тогда
Результат = Результат + " " + Лев(ЧастиСтроки[1], 1) + ".";
Если ЧастиСтроки.Количество() > 2 Тогда
Результат = Результат + " " + Лев(ЧастиСтроки[2], 1) + ".";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
СложныйОтборДинамическогоСписка (1С 8.3, 8.2, уф)
Пример кода, устанавливающего отбор в динамическом списке. В качестве параметра
процедуры может выступать например "Список.Отбор".
В процедуре создаётся группа "ГруппаПоБеременности" с логическим условием "ИЛИ", в
которую добавляется два элемента отбора. В первом элементе проверяется, что поле
"ОтпускПоБеременностиИРодам" не заполнено, а во втором, что оно больше или равно
текущей дате.
Таким образом отбор выбирает все элементы списка у которых поле
"ОтпускПоБеременностиИРодам" не заполнено или больше или равно текущей даты.
Процедура СложныйОтборДинамическогоСписка(Отбор)
ГруппаПоБеременности = Отбор.Элементы.Добавить(
Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаПоБеременности.ТипГруппы =
ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
ЭлементОтбора = ГруппаПоБеременности.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение =
Новый ПолеКомпоновкиДанных("ОтпускПоБеременностиИРодам");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора = ГруппаПоБеременности.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение =
Новый ПолеКомпоновкиДанных("ОтпускПоБеременностиИРодам");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементОтбора.ПравоеЗначение = ТекущаяДата();
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
СоздатьСтраницуНаФорме (1С 8.3, 8.2, уф)
Процедура программно создаёт страницу на управляемой форме. Требуется, чтобы на форме
уже присутствовал элемент "Закладки" типа "Страницы", в который и будет добавлена новая
страница. Для примера на созданной странице тут же размещается декорация типа"Надпись"
с текстом, указанным при вызове процедуры.
&НаСервере
Процедура СоздатьСтраницуНаФорме(НомерСтраницы, Заголовок, Текст)
Страница = Элементы.Добавить("Страница" + НомерСтраницы,
Тип("ГруппаФормы"), Элементы.Закладки);
Страница.Вид = ВидГруппыФормы.Страница;
Страница.Заголовок = Заголовок;
Надпись = Элементы.Добавить("Декорация" + НомерЗакладки,
Тип("ДекорацияФормы"), Страница);
Надпись.Вид = ВидДекорацииФормы.Надпись;
Надпись.Заголовок = Текст;
Надпись.РастягиватьПоВертикали = Истина;
Надпись.РастягиватьПоГоризонтали = Истина;
Надпись.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево;
Надпись.ВертикальноеПоложение = ВертикальноеПоложениеЭлемента.Верх;
КонецПроцедуры
ПроверитьСНИЛС (1С 8.3, 8.2)
Функция проверяет на корректность страховой номер индивидуального лицевого счета
(СНИЛС) в формате "ХХХ-ХХХ-ХХХ ХХ".
Функция ПроверитьСНИЛС(Знач Значение) Экспорт
СНИЛС = СокрЛП(Значение); /// ААА-БББ-ВВВ ГГ
Если СтрДлина(СНИЛС) <> 14 Тогда
Возврат Ложь;
КонецЕсли;
ГГ = СокрЛП(Прав(СНИЛС, 2));
Если СтрДлина(ГГ) <> 2 Тогда
Возврат Ложь;
КонецЕсли;
Если Не ПопыткаПеревестиВЧисло(ГГ) Тогда
Возврат Ложь;
КонецЕсли;
КонтрольноеЧисло = Число(ГГ);
АБВ = Лев(СНИЛС, 11);
Части = РазложитьСтрокуВМассивПодстрок(АБВ, "-");
Если Части.Количество() <> 3 Тогда
Возврат Ложь;
КонецЕсли;
Код = "";
Для Каждого Часть Из Части Цикл
Часть = СокрЛП(Часть);
Если СтрДлина(Часть) <> 3 Тогда
Возврат Ложь;
КонецЕсли;
Если Не ПопыткаПеревестиВЧисло(Часть) Тогда
Возврат Ложь;
КонецЕсли;
Код = Код + Часть;
КонецЦикла;
КонтрольнаяСумма = 0;
Для А = 1 По 9 Цикл
Число = Число(Сред(Код, А, 1));
КонтрольнаяСумма = КонтрольнаяСумма + Число * (10 - А);
КонецЦикла;
КонтрольнаяСумма = КонтрольнаяСумма % 101;
Если КонтрольнаяСумма < 100 Тогда
Возврат КонтрольнаяСумма = КонтрольноеЧисло;
ИначеЕсли КонтрольнаяСумма = 100 Или КонтрольнаяСумма = 101 Тогда
Возврат 0 = КонтрольноеЧисло;
КонецЕсли;
Возврат Истина;
КонецФункции
ПроверитьКорреспондентскийСчет (1С 8.3, 8.2)
Функция осуществляет проверку строки с корреспондентским счетом банка на корректность.
Вторым параметром передаётся БИК банка.
Функция ПроверитьКорреспондентскийСчет(Знач Значение, Знач БИК) Экспорт
Счет = СокрЛП(Значение);
Если
СтрДлина(Счет) <> 20 Или
Не ПопыткаПеревестиВЧисло(Счет)
Тогда
Возврат Ложь;
КонецЕсли;
Возврат ПроверитьСчет("0" + Сред(БИК, 5, 2) + Счет);
КонецФункции
Функция ПроверитьСчет(Строка)
Коэффициенты = Новый Массив(23);
Коэффициенты[0] = 7;
Коэффициенты[1] = 1;
Коэффициенты[2] = 3;
Коэффициенты[3] = 7;
Коэффициенты[4] = 1;
Коэффициенты[5] = 3;
Коэффициенты[6] = 7;
Коэффициенты[7] = 1;
Коэффициенты[8] = 3;
Коэффициенты[9] = 7;
Коэффициенты[10] = 1;
Коэффициенты[11] = 3;
Коэффициенты[12] = 7;
Коэффициенты[13] = 1;
Коэффициенты[14] = 3;
Коэффициенты[15] = 7;
Коэффициенты[16] = 1;
Коэффициенты[17] = 3;
Коэффициенты[18] = 7;
Коэффициенты[19] = 1;
Коэффициенты[20] = 3;
Коэффициенты[21] = 7;
Коэффициенты[22] = 1;
КонтрольнаяСумма = 0;
Для А = 1 По 23 Цикл
Число = Число(Сред(Строка, А, 1));
КонтрольнаяСумма = КонтрольнаяСумма + Число * Коэффициенты[А - 1];
КонецЦикла;
КонтрольноеЧисло = КонтрольнаяСумма % 10;
Возврат КонтрольноеЧисло = 0;
КонецФункции
ПроверитьРасчетныйСчет (1С 8.3, 8.2)
Функция осуществляет проверку строки с расчетным счетом организации в банке на
корректность. Вторым параметром передаётся БИК банка, в котором открыт счет.
Функция ПроверитьРасчетныйСчет(Знач Значение, Знач БИК) Экспорт
Счет = СокрЛП(Значение);
Если
СтрДлина(Счет) <> 20 Или
Не ПопыткаПеревестиВЧисло(Счет)
Тогда
Возврат Ложь;
КонецЕсли;
Возврат ПроверитьСчет(Прав(БИК, 3) + Счет);
КонецФункции
Функция ПроверитьСчет(Строка)
Коэффициенты = Новый Массив(23);
Коэффициенты[0] = 7;
Коэффициенты[1] = 1;
Коэффициенты[2] = 3;
Коэффициенты[3] = 7;
Коэффициенты[4] = 1;
Коэффициенты[5] = 3;
Коэффициенты[6] = 7;
Коэффициенты[7] = 1;
Коэффициенты[8] = 3;
Коэффициенты[9] = 7;
Коэффициенты[10] = 1;
Коэффициенты[11] = 3;
Коэффициенты[12] = 7;
Коэффициенты[13] = 1;
Коэффициенты[14] = 3;
Коэффициенты[15] = 7;
Коэффициенты[16] = 1;
Коэффициенты[17] = 3;
Коэффициенты[18] = 7;
Коэффициенты[19] = 1;
Коэффициенты[20] = 3;
Коэффициенты[21] = 7;
Коэффициенты[22] = 1;
КонтрольнаяСумма = 0;
Для А = 1 По 23 Цикл
Число = Число(Сред(Строка, А, 1));
КонтрольнаяСумма = КонтрольнаяСумма + Число * Коэффициенты[А - 1];
КонецЦикла;
КонтрольноеЧисло = КонтрольнаяСумма % 10;
Возврат КонтрольноеЧисло = 0;
КонецФункции
ПроверитьРегистрационныйНомерФСС (1С 8.3, 8.2)
Функция делает проверку корректности регистрационного номера организации в ФСС.
Функция ПроверитьРегистрационныйНомерФСС(Знач Значение) Экспорт
Номер = СокрЛП(Значение);
Если Не ПопыткаПеревестиВЧисло(Номер) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрДлина(Номер) = 10;
КонецФункции
ПроверитьРегистрационныйНомерПФР (1С 8.3, 8.2)
Функция проверяет корректность строки с регистрационным номером организации в ПФР.
Формат строки: xxx-xxx-xxxxxx.
Функция ПроверитьРегистрационныйНомерПФР(Знач Значение) Экспорт
Номер = СокрЛП(Значение); // ххх-ххх-хххххх
Части = РазложитьСтрокуВМассивПодстрок(Номер, "-");
// часть 1 ххх
Часть1 = СокрЛП(Части[0]);
Если СтрДлина(Часть1) <> 3 Тогда
Возврат Ложь;
КонецЕсли;
Если Не ПопыткаПеревестиВЧисло(Часть1) Тогда
Возврат Ложь;
КонецЕсли;
// часть 2 ххх
Часть2 = СокрЛП(Части[1]);
Если СтрДлина(Часть2) <> 3 Тогда
Возврат Ложь;
КонецЕсли;
Если Не ПопыткаПеревестиВЧисло(Часть2) Тогда
Возврат Ложь;
КонецЕсли;
// часть 3 хххххх
Часть3 = СокрЛП(Части[2]);
Если СтрДлина(Часть3) <> 6 Тогда
Возврат Ложь;
КонецЕсли;
Если Не ПопыткаПеревестиВЧисло(Часть3) Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
ПроверитьКодыИФНС (1С 8.3, 8.2)
Функция проверяет на корректность коды налоговых инспекций, перечисленные через
запятую.
Функция ПроверитьКодыИФНС(Знач Значение) Экспорт
КодыИФНС = СокрЛП(Значение);
МассивКодов = РазложитьСтрокуВМассивПодстрок(КодыИФНС);
Для Каждого КодСтрока Из МассивКодов Цикл
КодСтрока = СокрЛП(КодСтрока);
Если СтрДлина(КодСтрока) <> 4 Тогда
Возврат Ложь;
КонецЕсли;
Если Не ПопыткаПеревестиВЧисло(КодСтрока) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
РазложитьСтрокуВМассивПодстрок (1С 8.3, 8.2)
Функция раскладывает строку в массив подстрок согласно указанному разделителю.
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",",
Знач ПропускатьПустыеСтроки = Неопределено)
Результат = Новый Массив;
// для обеспечения обратной совместимости
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Строка) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Результат.Добавить(Подстрока);
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
Результат.Добавить(Строка);
КонецЕсли;
Возврат Результат;
КонецФункции
ПроверитьОГРН (1С 8.3,8.2)
Функция выполняет проверку переданной строки с ОГРН на предмет корректности согласно
алгоритму подсчёта контрольных сумм. Возвращает Истина, если Ок, иначе Ложь.
Функция ПроверитьОГРН(Знач Значение) Экспорт
ОГРН = СокрЛП(Значение);
Если Не ПопыткаПеревестиВЧисло(ОГРН) Тогда
Возврат Ложь;
КонецЕсли;
Если СтрДлина(ОГРН) = 13 Тогда
Число = Число(Сред(ОГРН, 1, 12));
Остаток = Число % 11;
Если Остаток > 9 Тогда
Остаток = Остаток % 10;
КонецЕсли;
Возврат Остаток = Число(Сред(ОГРН, 13, 1));
ИначеЕсли СтрДлина(ОГРН) = 15 Тогда
Число = Число(Сред(ОГРН, 1, 14));
Остаток = Число % 13;
Если Остаток > 9 Тогда
Остаток = Остаток % 10;
КонецЕсли;
Возврат Остаток = Число(Сред(ОГРН, 15, 1));
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
ПроверитьКПП (1С 8.3, 8.2)
Функция проверяет переданную строку с КПП на предмет корректности.
Возвращает Истина, если Ок, иначе Ложь.
Функция ПроверитьКПП(Знач Значение) Экспорт
КПП = СокрЛП(Значение);
Если Не ПопыткаПеревестиВЧисло(КПП) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрДлина(КПП) = 9;
КонецФункции
ПроверитьИНН (1С 8.3, 1С 8.2)
Функция проверяет переданную ей строку с ИНН (10 цифр для юридического и 12 цифр для
физического лица) на предмет корректности согласно алгоритму расчета контрольного
числа. Возвращает Истина, если всё Ок, иначе Ложь.
Функция ПроверитьИНН(Знач Значение) Экспорт
ИНН = СокрЛП(Значение);
Если Не ПопыткаПеревестиВЧисло(ИНН) Тогда
Возврат Ложь;
КонецЕсли;
Если СтрДлина(ИНН) = 10 Тогда
Коэффициенты = Новый Массив(10);
Коэффициенты[0] = 2;
Коэффициенты[1] = 4;
Коэффициенты[2] = 10;
Коэффициенты[3] = 3;
Коэффициенты[4] = 5;
Коэффициенты[5] = 9;
Коэффициенты[6] = 4;
Коэффициенты[7] = 6;
Коэффициенты[8] = 8;
Коэффициенты[9] = 0;
КонтрольнаяСумма = 0;
Для А = 1 По 10 Цикл
Число = Число(Сред(ИНН, А, 1));
КонтрольнаяСумма = КонтрольнаяСумма +
Число * Коэффициенты[А - 1];
КонецЦикла;
КонтрольноеЧисло = КонтрольнаяСумма % 11;
Если КонтрольноеЧисло > 9 Тогда
КонтрольноеЧисло = КонтрольноеЧисло % 10;
КонецЕсли;
Возврат КонтрольноеЧисло = Число(Сред(ИНН, 10, 1));
ИначеЕсли СтрДлина(ИНН) = 12 Тогда
Коэффициенты = Новый Массив(12);
Коэффициенты[0] = 3;
Коэффициенты[1] = 7;
Коэффициенты[2] = 2;
Коэффициенты[3] = 4;
Коэффициенты[4] = 10;
Коэффициенты[5] = 3;
Коэффициенты[6] = 5;
Коэффициенты[7] = 9;
Коэффициенты[8] = 4;
Коэффициенты[9] = 6;
Коэффициенты[10] = 8;
Коэффициенты[11] = 0;
КонтрольнаяСумма11 = 0;
Для А = 1 По 11 Цикл
Число = Число(Сред(ИНН, А, 1));
КонтрольнаяСумма11 = КонтрольнаяСумма11 +
Число * Коэффициенты[А];
КонецЦикла;
КонтрольноеЧисло11 = КонтрольнаяСумма11 % 11;
Если КонтрольноеЧисло11 > 9 Тогда
КонтрольноеЧисло11 = КонтрольноеЧисло11 % 10;
КонецЕсли;
Если КонтрольноеЧисло11 <> Число(Сред(ИНН, 11, 1)) Тогда
Возврат Ложь;
КонецЕсли;
КонтрольнаяСумма12 = 0;
Для А = 1 По 12 Цикл
Число = Число(Сред(ИНН, А, 1));
КонтрольнаяСумма12 = КонтрольнаяСумма12 +
Число * Коэффициенты[А - 1];
КонецЦикла;
КонтрольноеЧисло12 = КонтрольнаяСумма12 % 11;
Если КонтрольноеЧисло12 > 9 Тогда
КонтрольноеЧисло12 = КонтрольноеЧисло12 % 10;
КонецЕсли;
Если КонтрольноеЧисло12 <> Число(Сред(ИНН, 12, 1)) Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
ПопыткаПеревестиВЧисло (1С 8.3, 1С 8.2)
Функция пытается перевести в число переданный аргумент (с обработкой исключения). Если
удалось без ошибок - возвращает Истина, иначе возвращает Ложь.
Функция ПопыткаПеревестиВЧисло(Значение)
Попытка
Результат = Число(Значение);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Бесплатные обработки и программы для 1С:Бухгалтерия 8.3,
8.2, 7.7
То чего не хватает всем
Табель учета рабочего времени
Перенумерация справочников и документов
Перепроведение документов
Групповая печать кассовых ордеров (ПКО и РКО) за период
Акт на списание товарно-материальных ценностей
Налоги и взносы с ФОТ по подразделениям
Автоматизация рутины
Подбор материалов для списания
Закрытие отрицательных остатков на 41 счете
Заполнение реквизитов контрагента по ИНН
Обновление, архивация и настройка
Обновлятор-1С: групповое (пакетное) обновление всех баз за один раз!
Бэкапер-1С: резервные копии бухгалтерии
Копиратор-1С: выгрузка и загрузка базы
Изменение масштаба (компактности) интерфейса "Такси"
Обучение
Изучение бухгалтерских проводок
Для программистов
Обработки для программистов
Все уроки
Учитываем районный коэффициент и северную надбавку
Как включить приемы на работу, переводы и увольнения
Как включить учет больничных, отпусков и исполнительных документов
Покупка иностранной валюты
Учимся формировать прайс-лист
Групповое перепроведение документов
Хитрости при работе в 1С Часть 4
Как оформить расходный кассовый ордер
Как оформить приходный кассовый ордер
Учимся работать с ГТД по импорту
Учимся работать с НДС часть 6 - ставка 0% при экспорте
Учимся работать с НДС часть 5 - исправленный счет-фактура
Учимся работать с НДС часть 4 - корректировочный счет-фактура
Учимся работать с НДС часть 3 - авансы поставщикам
Учимся работать с НДС часть 2 - авансы от покупателей
Последний шанс найти резервную копию
Хитрости при работе в 1С Часть 3
Учимся работать с регистрами
Учимся работать с НДС часть 1
Учимся включать дополнительные расходы в стоимость ТМЦ
Учимся составлять акт сверки расчетов
Учимся проводить инвентаризацию ТМЦ
Учимся работать с корпоративными картами
Учёт подарочных сертификатов
Учимся делать пакетное выставление актов и счетов-фактур
Учимся делать установку цен
Учимся перечислять зарплату на карточку
Учимся делать монтаж ОС из комплектующих
Учимся комплектовать товар
Учимся оформлять авансовые отчёты на примерах
Учимся начислять зарплату при совмещении режимов УСН-ЕНВД
Учимся заносить операции по эквайрингу
Учимся работать с бухгалтерскими отчётами: Анализ счёта
Учимся работать с бухгалтерскими отчётами: ОСВ по счёту
Учимся работать с бухгалтерскими отчётами: Оборотно-сальдовая ведомость
Как добавить 1С в исключения антивируса, чтобы не тормозило?
Какую версию 1С выбрать: базовую или проф?
Настройте меню бухгалтерии правильно!
УСН: признание доходов и расходов
Обновляйте ваши базы с удовольствием!
Как избавиться от ввода имени и пароля пользователя при запуске 1С?
Где меняются счета учёта номенклатуры
Помогите! Сломалась база...
Начисление отпуска по беременности и родам
Как обновить классификатор банков
Как добавить печать, подпись и логотип в печатную форму счёта на оплату покупателю
Как отправить счёт на оплату покупателю прямо из 1С
Как легко и просто создавать свои шаблоны договоров
Увлекательная бухгалтерия для программистов
Суммовой учёт по продажным ценам в рознице
Как узнать курс валюты на определенную дату?
Как загрузить курсы валют?
Переоценка валюты
Где можно скачать ФИАС по регионам для 1С и как его загрузить в программу?
Зачем нужна "Корректировка номенклатуры"?
Что означает то или иное регламентное задание (их виды)
Автоматически рассчитываем налоговую нагрузку в зависимости от режима
Заполняем сведения об контрагенте автоматически по ИНН
Разгоняем "Такси" до максимальной скорости
Настраиваем "Такси" под себя в 4 шага
Обзор нового интерфейса "Такси" в 1С:Бухгалтерия 8.3 (редакция 3.0)
Как убрать интерфейс "Такси"
Настройка пользователей и их прав доступа
Поиск и удаление дублей
Хитрости при работе в 1С Часть 2
Как послать базу 1С через интернет программисту
Как загрузить выписки из банк-клиента
Хитрости при работе в 1С Часть 1
Как вывести на печать журнал или табличную часть документа
Как включить тонкого клиента для базовой версии
Как правильно начислять зарплату
Как добавить дополнительный реквизит к элементу справочника
Как удалить из базы помеченные на удаление объекты
Как обновить конфигурацию 1С:Бухгалтерия 8.3 до последней версии
Как включить возможность добавления внешних печатных форм и обработок
Как пользователю изменить макет печатной формы
Оформление больничного
Оформление ежегодного отпуска
Как установить ставку взноса на страхование от несчастных случаев
Как оформить сдачу выручки из кассы в банк, чтобы не задвоились проводки
Как установить северную надбавку и районный коэффициент
Чем толстый клиент отличается от тонкого
Особенности интерфейса
Как установить дату запрета изменения данных
Как заполнить производственный календарь
Как загрузить данные выгруженные из торговли или зарплаты?
Как заставить закрытие месяца не ругаться на прошлые периоды
Как переключаться между толстым и тонким клиентами
Как вернуть макет печатной формы по умолчанию
Как делать групповую печать документов
Как отключить контроль отрицательных остатков запасов
Как в 1С:Бухгалтерия 8.3 открыть меню "Функции для технического специалиста..."
Как удалить кэш 1С?
Как послать в письме программисту снимок экрана с проблемой в 1С
Как послать в письме программисту техническую информацию об 1С
Взносы на ОПС с 2014 года для 1С Бухгалтерия 8.3
Как изменить уже зарегистрированную внешнюю печатную форму (или обработку)
Как добавить (зарегистрировать) внешнюю печатную форму (или обработку)
Как ускорить работу в 1С:Бухгалтерия 8.3
Как включить картинки в 1С:Бухгалтерии 8.3
Где можно скачать КЛАДР для 1С и как его загрузить в программу?
Как обновить конфигурацию 1С:Бухгалтерия 8.2 до последней версии
Как обновить платформу 1С Предприятие до последней версии
Как перейти на новую редакцию 1С:Бухгалтерия 3.0 со старой редакции 2.0
Использование утилиты chdbfl для тестирования и исправления физической целостности
базы
Как сделать тестирование и исправление базы
Как восстановить из резервной копии базу
Как сделать резервную копию базы
Как узнать версию базы 1С
Как подключить базу 1С
Ответы на вопросы по 1С:Бухгалтерия
Ошибка: "Значение не является значением объектного типа (элементы)"
Обнаружено нарушение целостности системы 1с и база закрывается
Где указать, что аналитический учет ведется по каждому работнику
Куда пропала настройка "Формы в отдельных окнах"
Как установить внешнюю форму декларации об экологии
Как очистить регистр сведений "Данные первичных документов"
Я скачал обработку с сайта и она не работает.
Ошибка подключения расширения...
Что же отвечать на вопрос "Информационная база была перемещена или восстановлена"?
Ошибка "Поле склад не заполнено"
Как разрешить интерактивное открытие внешних отчетов и обработок?
Ошибка "Поле объекта не обнаружено (ПарольАдминистратораИнформационнойБазы)"
Ошибка "Итератор для значения не определен"
Не могу найти справку 6-НДФЛ для "двойки"
Перестал работать отбор в оборотно-сальдовой ведомости по счёту
Где находится пункт "Ещё"?
Будет ли поддерживаться 1С:Бухгалтерия 2.0 в 2016 году
Как правильно отразить снятие денег из банка в кассу на зарплату
Куда пропала галка "Ручная корректировка" в документе "Начисление зарплаты"
Как отразить начисленный вручную НДФЛ в регистре налогового учёта
Какая у меня бухгалтерия: базовая или проф?
Как открыть параметры учета?
Как правильно настроить порядок признания расходов в УСН
Как для одной организации добавить несколько налоговых
Пропало поле "Отразить вычет НДС в книге покупок" для "двойки"
Как установить дату запрета изменения данных в "двойке"
Ошибка "Код причины постановки на учет в КПП организации должен быть равен 35 или 77"
Как заполнить производственный календарь для "двойки"
Поддержка двойки продлена на 2015 год
Ошибка формата потока
Куда пропал код ОКПО у контрагентов?
Возникла исключительная ситуация при запуске программы (недостаточно фактических
параметров)
Как вернуть подтверждение при завершении работы 1С Бухгалтерии 8.3
1С:Бухгалтерия 8.3 не видит новую версию платформы
Ошибка "Файл базы данных поврежден" для 1С:Бухгалтерия 8.3
Ошибка "Себестоимость продаж в налоговом учете отражена неверно"
В авансовом отчете 1С:Бухгалтерия 8.3 не отображается поле склад
Не проставляется ОКАТО в отчете по НДС для 1С:Бухгалтерия 8.3
Как изменить печатную форму т-51 для 1С:Бухгалтерии 8.2
В накладной 1С:Бухгалтерия 8.3 товар ставится БЕЗ НДС
Не печатается справка 4-н 2013 года в 1С:Бухгалтерия 8.2
Как исправить: база не копируется, повреждена
Проблема с закрытием месяца в 1С 8.3
1С бухгалтерия 8.2 стала неправильно считать НДФЛ
Ну может хоть Вы подскажете??? Проблема с 1с.
Вопрос по установке продажных цен на основании закупочных
Вопрос про иностранцев в 1с 8.3
Ошибка при попытке изменить учетную политику "Объект не найден"
Ошибка: "Поле объекта недоступно для записи (РабочаяДата)"
Ошибка: "Значение не является значением объектного типа (ПравоеЗначение)" в
1С:Бухгалтерия 8.3
Возможно ли вернуть большие картинки разделов
Ошибка: "ОбщаяКоманда.ПоказатьДвиженияДокумента Переменная не определена
(ЭтотОбъект)"
Ошибка: 1С:Бухгалтерия 8.3 не видит НДФЛ, перечисленный в бюджет
Где в 1С:Бухгалтерия 8.3 находится документ "Начисление налогов(взносов) с ФОТ
Как узнать какая у меня база 1С: серверная или файловая?
Ошибка: "Не совпадает версия временного файла" для 1С 8.3
Ошибка: "Поле объекта не обнаружено (ПорядокОтраженияАванса)" для 1С:Бухгалтерия 8.3
Ошибка: 1С:Бухгалтерия 8.3 , несмотря на обновление, начисляет ПФР отдельно на
накопительную и страховую части
Как сделать, чтобы в заголовке окна выводилось название организации для 1С:Бухгалтерия
8.3
База 1С:Бухгалтерия после перехода на 8.3 сильно увеличилась в размерах
Ошибка: задвоение НДФЛ в Анализе начисленных налогов и взносов с ФОТ в 1С Бухгалтерии
8.2
Как открыть производственный календарь в 1С Бухгалтерия 8.3
Ошибка: Не указывается номер и дата счета в Счете на оплату покупателю в 1С:Бухгалтерия
8.3
Ошибка по сотруднику "не задана фамилия" и "не задано имя" в пачке документов СЗВ-6
(1С:Бухгалтерия 8.2 ) при подготовке документов ПФР
Взносы на ОПС с 2014 года для 1С Бухгалтерия 8.2
Будут ли работать 1С 7.7 и 8.3 на одном компьютере?
Обязательно ли будет переходить на 1с бухгалтерия 8.3 с 2015 года?
Налоговая не приняла отчет, сделанный в 1С. Говорят старая версия, где взять новую?
Как выгрузить базу из 1С 8.3 в 8.2?
Подходит ли база от 1С 7 к 1С 8?
Как вернуть выгруженную базу 1С?
Сколько времени тестируется база 1С бухгалтерия 8.3 ?
ОКАТО или ОКТМО при сдачи отчетности за 2013 год?
Как сделать реструктуризацию информационной базы 1С 8.3?
Как в 1С 8.3 загрузить базу 8.2?
Я скачал обработку с сайта, как мне её открыть в 1C?
Учет рабочего времени в 1С бухгалтерии 8, возможен ли?
В 1С бухгалтерия 8 сбилась нумерация документов, что делать?
Ошибка 'Недоступно обновление на версию 2.0.54.11 с текущей версии' в 1С:Бухгалтерии 8.2
Ошибка 'Значение не является значением объектного типа (ИностраннаяОрганизация)' в
1С:Бухгалтерии 8.2
Какой порядок заполнения таблицы 10 из формы 4-фсс №107н от 19.03.2013 за первое
полугодие 2013 года?
Где можно скачать форму 4-фсс №107н от 19.03.2013 (бланк в excel)?
В отчете 4-фсс за 2 квартал 2013 неправильно сохраняется дата создания отчета
(1С:Бухгалтерия 7.7)
В отчете 4-фсс от 19.03.2013 №107н во втором разделе отсутствует таблица 10
Полезные ссылки для бухгалтеров
Статья устарела и требует переработки?
Здесь я буду поддерживать актуальный список ресурсов, пользу от которых заметит каждый
бухгалтер.
В помощь бухгалтеру
Действующие в РФ налоги и сборы
Консультант плюс
Сдаём ПФР без 1С
Сдаём 3 и 4-НДФЛ без 1С
Архивы с программой "Налогоплательщик (2-НДФЛ)" за прошлые годы
Мониторинг изменений законодательства и планы по их реализации в программах фирмы
"1С"
Онлайн проверка отчетов
Проверяем выгрузку 4-ФСС на сайте ФСС
Узнать коды статистики по ОГРН
Узнать код ФСС по ИНН/КПП
Узнать регистрационный номер ПФР по ИНН
Попробовать демо-версии 1С
Посмотреть решения от 1С
Узнать официальные цены от 1С
Узнать актуальные версии 1С
Найти в своём городе программистов 1С
Download