Как в 1C 8.3, 1С 8.2 работать с регистром сведений. Регистры сведений 1C 8.3, 1С 8.2.
Замер производительности
Для более точных замеров — с версии платформы можно использовать метод ГК
1 2 3 4 5 6 7 8 9 10 11 |
докВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); //процедура замера докВремяКонцаВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах(); докДельта = (докВремяКонцаВыполнения - докВремяНачала) / 1000; докДельтаПредставление = ПолучитьПредставлениеВремени(докДельта); Функция ПолучитьПредставлениеВремени(Время) Секунды = Время % 60; Минуты = (Время-Секунды)/60; Минуты = Минуты % 60; Часы = (Время-Секунды-Минуты)/3600; Возврат "" + Окр(Часы) + " ч. " + Окр(Минуты) + " мин. " + Окр(Секунды, 2) + " сек."; КонецФункции |
или
1 2 3 4 5 6 7 8 9 10 11 12 |
Старт = ТекущаяДата(); // Произвольный код.... Финиш = ТекущаяДата(); КолСекундЛог = Финиш - Старт; чч = ЦЕЛ(КолСекундЛог/3600); мм = ЦЕЛ((КолСекундЛог - чч*3600)/60); сс = КолСекундЛог - чч*3600 - мм*60; СтрокаВремя = Формат(чч, "ЧЦ=2; ЧН=; ЧВН=") + ":" + Формат(мм, "ЧЦ=2; ЧН=; ЧВН=") + ":" + Формат(сс, "ЧЦ=2; ЧН=; ЧВН=") + " ("+ КолСекундЛог +" сек.)"; Сообщить("" + ТекущаяДата() + ": обработано за " + СтрокаВремя + ".", СтатусСообщения.Информация); |
или
1 2 3 4 5 6 7 8 9 |
Попытка Scr = Новый COMОбъект("MSScriptControl.ScriptControl"); Исключение Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат 0; КонецПопытки; Scr.Language = "javascript"; Время = Scr.Eval("new Date().getTime()"); Возврат Время; |
или
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
// клиентский модуль Процедура ЗасечьТаймер() Экспорт УправляемыйИнтерфейсСервер.СохранитьЗначениеВХранилище( "ТекВремяТаймера", ТекущаяДата() ); //ПоместитьВоВременноеХранилище( ТекущаяДата(), ); КонецПроцедуры Процедура ПоказатьВремяТаймера( пЗаголовок = "", пЧерезСообщение = Ложь ) Экспорт д = УправляемыйИнтерфейсСервер.ПолучитьЗначениеИзХранилища( "ТекВремяТаймера" ); общ = ТекущаяДата() - д; мин = цел( общ / 60 ); сек = общ - мин * 60; час = цел( мин / 60); мин = мин - час * 60; лВрем = ?( пЧерезСообщение, "Время выполнения:", "Время:" ); Если час <> 0 Тогда лВрем = лВрем + " " + час + " час" КонецЕсли; Если Мин <> 0 Тогда лВрем = лВрем + " " + мин + " мин" КонецЕсли; лВрем = лВрем + " " + сек + " сек"; Если пЧерезСообщение=Ложь Тогда ПоказатьОповещениеПользователя( пЗаголовок, , лВрем ); Иначе Сообщить( ?( ПустаяСтрока( пЗаголовок ), "Действие выполнено", пЗаголовок ) + ". " + лВрем ); КонецЕсли; КонецПроцедуры // серверный модуль УправляемыйИнтерфейсСервер Процедура СохранитьЗначениеВХранилище( пКлюч, пЗначение ) Экспорт ХранилищеСистемныхНастроек.Сохранить( , пКлюч, пЗначение, , ПараметрыСеанса.ТекущийПользователь ); КонецПроцедуры Функция ПолучитьЗначениеИзХранилища( пКлюч ) Экспорт Возврат ХранилищеСистемныхНастроек.Загрузить( , пКлюч, , ПараметрыСеанса.ТекущийПользователь ); КонецФункции // пример использования &НаКлиенте Процедура СделатьЧтоТо() УправляемыйИнтерфейс.ЗасечьТаймер(); // что-то делаем // ...................... УправляемыйИнтерфейс.ПоказатьВремяТаймера("Сделали что-то!"); КонецПроцедуры |
Проверка значения на вхождение в некоторый интервал
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Проверка значения на вхождение в некоторый интервал // //Параметры (название, тип, дифференцированное значение): // Значение - Число, Дата - Проверяемое значение // НачалоИнтервала - Число, Дата // КонецИнтервала - Число, Дата // СтрогаяПроверка - Булево // //Возвращаемое значение: // Булево // Функция ЗначениеВИнтервале(Значение, НачалоИнтервала, КонецИнтервала, СтрогаяПроверка = Ложь) Если СтрогаяПроверка Тогда Возврат НачалоИнтервала < Значение И Значение < КонецИнтервала; Иначе Возврат НачалоИнтервала <= Значение И Значение <= КонецИнтервала; КонецЕсли; КонецФункции Если НЕ ЗначениеВИнтервале(ДатаПоказателя, НачалоПериода, КонецПериода) Тогда Продолжить; КонецЕсли; |
Разбиение строки на левую и правую часть
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Функция РазбитьСтроку(ИсходнаяСтрока, СтрокаРазделитель, ОбрезатьПробелы = Истина) поз = Найти(ИсходнаяСтрока, СтрокаРазделитель); ДлинаРазделителя = СтрДлина(СтрокаРазделитель); Разбито = поз > 0; ЛеваяЧастьСтроки = Лев(ИсходнаяСтрока, поз - 1); Если ОбрезатьПробелы Тогда ЛеваяЧастьСтроки = СокрЛП(ЛеваяЧастьСтроки); КонецЕсли; ПраваяЧастьСтроки = Сред(ИсходнаяСтрока, поз + ДлинаРазделителя); Если ОбрезатьПробелы Тогда ПраваяЧастьСтроки = СокрЛП(ПраваяЧастьСтроки); КонецЕсли; СтруктураЧастиСтроки = Новый Структура("Левая, Правая, Разбито" , ЛеваяЧастьСтроки , ПраваяЧастьСтроки , Разбито); Возврат СтруктураЧастиСтроки; КонецФункции //Парсинг строки вида "дд.мм.гггг": Результат = Дата(1,1,1); СтруктураЧастиСтроки = РазбитьСтроку(ЗначениеЯчейки, "."); Если СтруктураЧастиСтроки.Разбито Тогда ст_дд = Прав(СтруктураЧастиСтроки.Левая, 2); чс_дд = Число(ст_дд); СтруктураЧастиСтроки = РазбитьСтроку(СтруктураЧастиСтроки.Правая, "."); Если СтруктураЧастиСтроки.Разбито Тогда ст_мм = Прав(СтруктураЧастиСтроки.Левая, 2); чс_мм = Число(ст_мм); ст_гггг = Лев(СтруктураЧастиСтроки.Правая, 4); чс_гггг = Число(ст_гггг); Результат = Дата(чс_гггг, чс_мм, чс_дд); КонецЕсли; КонецЕсли; Возврат Результат; |
Строка в массив
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Функция РазложитьСтрокуВМассив(Знач Стр, Разделитель = ";") МассивСтрок = Новый Массив(); Если Разделитель = " " Тогда Стр = СокрЛП(Стр); Пока 1=1 Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = СокрЛ(Сред(Стр,Поз)); КонецЦикла; Иначе ДлинаРазделителя = СтрДлина(Разделитель); Пока 1=1 Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = Сред(Стр,Поз+ДлинаРазделителя); КонецЦикла; КонецЕсли; КонецФункции |
Преобразование табличного документа в таблицу значений (перебор)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Функция ТабличныйДокументВТаблицуЗначений(ТабДок) ТаблицаДанныеДокумента = Новый ТаблицаЗначений(); Для СчетчикКолонок = 1 По ТабДок.ШиринаТаблицы Цикл ИмяКолонки = "_" + СчетчикКолонок; ТаблицаДанныеДокумента.Колонки.Добавить(ИмяКолонки); Для СчетчикСтрок = 1 По ТабДок.ВысотаТаблицы Цикл ИндексСтроки = СчетчикСтрок - 1; Если СчетчикКолонок = 1 Тогда СтрокаТаблицы = ТаблицаДанныеДокумента.Добавить(); Иначе СтрокаТаблицы = ТаблицаДанныеДокумента[ИндексСтроки]; КонецЕсли; ТекущаяЯчейка = ТабДок.Область(СчетчикСтрок, СчетчикКолонок); ЗначениеЯчейки = ТекущаяЯчейка.Текст; СтрокаТаблицы[ИмяКолонки] = ЗначениеЯчейки; КонецЦикла КонецЦикла; Возврат ТаблицаДанныеДокумента; КонецФункции |
Загрузка файлов Excel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
&НаСервере Процедура ИсправитьСтудентовНаСервере(ИмяФайла) н = 1; п = 1; а = 1; Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(ИмяФайла); Сообщить("Обработка файла Microsoft Excel..."); Исключение Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!"); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Попытка Excel.Sheets(1).Select(); ЛистExcel= Excel.Sheets(1); Исключение Excel.ActiveWorkbook.Close(); Excel = 0; Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!"); ОтменитьТранзакцию(); Возврат; КонецПопытки; Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1); Если Версия = "8" Тогда КолСтрок = Excel.Cells.CurrentRegion.Rows.Count; КолКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13); Иначе КолСтрок = Excel.Cells(1,1).SpecialCells(11).Row; КолКолонок = Excel.Cells(1,1).SpecialCells(11).Column; Конецесли; Для Строка = 1 по КолСтрок Цикл ФИО= СОкрЛП(Строка(ЛистExcel.Cells(Строка,1).Value)); Отдельно = СтрЗаменить(ФИО, " ", Символы.ПС); Фамилия = СтрПолучитьСтроку(Отдельно, 1); Имя = СтрПолучитьСтроку(Отдельно, 2); Отчество = СтрПолучитьСтроку(Отдельно, 3); Отчество2 = СтрПолучитьСтроку(Отдельно, 4); Если ЗначениеЗаполнено(Отчество2) Тогда //Сообщить(" !!! Пропущен: " + Фамилия + " " + Имя + " " + Отчество + " " + Отчество2); п=п+1; Иначе Если ЗначениеЗаполнено(СокрЛП(Строка(ЛистExcel.Cells(Строка,2).Value))) Тогда ЛистExcel.Cells(Строка, 2).NumberFormat ="ДД.ММ.ГГГГ"; ДатаРождения = СокрЛП(Строка(ЛистExcel.Cells(Строка,2).Value)); ДатаРождения = СтрЗаменить(СокрЛП(ДатаРождения), ".", ""); ДатаРождения = Лев(ДатаРождения, 8); ГодР = Прав(СокрЛП(ДатаРождения), 4); МесяцР = Сред(СокрЛП(ДатаРождения), 3, 2); ЧислоР = Лев(СокрЛП(ДатаРождения), 2); ДатаРождения = Дата(ГодР, МесяцР, ЧислоР); КонецЕсли; ФизическоеЛицо= ПолучитьСсылкуНаФизлицоДР(Фамилия, Имя, Отчество, ДатаРождения); Если ЗначениеЗаполнено(ФизическоеЛицо) Тогда ФизическоеЛицоОбъект= ФизическоеЛицо.ПолучитьОбъект(); Если НЕ ФизическоеЛицоОбъект.Сотрудник= ПолучитьСтатус("Студент") Тогда Сообщить(Строка(а) + " Не заполнено поле Студент: " + ФизическоеЛицо); а=а+1; КонецЕсли; КонецЕсли; КонецЕсли; н=н+1; КонецЦикла; Excel.DisplayAlerts = 0; Excel.Quit(); Excel.DisplayAlerts = 1; Сообщить(">>Всего загружено данных:" + н + " шт."); Сообщить(">>Всего из них пропущено:" + п + " шт."); КонецПроцедуры &НаКлиенте Процедура ИсправитьСтудентов(Команда) Выбор = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Выбор.Заголовок = "Выберите файл фомата XLS(XLSX) с данными обучающихся"; Выбор.ПолноеИмяФайла = ""; Выбор.МножественныйВыбор = Ложь; Выбор.Фильтр = "Файл XLS(*.xls)|*.xls"; Если Выбор.Выбрать() Тогда Путь= Выбор.Каталог; Имя= Выбор.ПолноеИмяФайла; КонецЕсли; Попытка Объект.трПуть = Путь; РежимВопроса = РежимДиалогаВопрос.ДаНетОтмена; Ответ = Вопрос("Загрузить данные?", РежимВопроса, 0); Если Ответ = КодВозвратаДиалога.Да Тогда ИсправитьСтудентовНаСервере(Имя); КомандаСистемы("taskkill /F /IM excel.exe"); КонецЕсли; Сообщить(">>Обработан файл: " + Имя); Исключение Сообщить("!Возникли проблемы при обработке файла: " + Имя); КонецПопытки; КонецПроцедуры |
или весь лист Excel сразу в память
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт Если ЛистЭксель = Неопределено Тогда ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application"); КонецЕсли; Если ВсегоСтрок = 0 Тогда ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row; КонецЕсли; Если ВсегоКолонок = 0 Тогда ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column; КонецЕсли; Если ТЗ = Неопределено Тогда ТЗ = Новый ТаблицаЗначений; Для Счетчик = 1 По ВсегоКолонок Цикл ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка")); КонецЦикла; КонецЕсли; Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл НоваяСтрока = ТЗ.Добавить(); КонецЦикла; Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок)); Данные = Область.Value.Выгрузить(); Для Счетчик = 0 По ВсегоКолонок-1 Цикл ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик); КонецЦикла; ЛистЭксель = Неопределено; Возврат ТЗ; КонецФункции |
Выгрузить Excel или прекратить работу приложения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Выбор = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Выбор.Заголовок = "Выберите файл фомата XLS(XLSX) с данными обучающихся"; Выбор.ПолноеИмяФайла = ""; Выбор.МножественныйВыбор = Ложь; Выбор.Фильтр = "Файл XLS(*.xls)|*.xls"; Если Выбор.Выбрать() Тогда Путь= Выбор.Каталог; Имя= Выбор.ПолноеИмяФайла; КонецЕсли; Попытка РежимВопроса = РежимДиалогаВопрос.ДаНетОтмена; Ответ = Вопрос("Загрузить данные?", РежимВопроса, 0); Если Ответ = КодВозвратаДиалога.Да Тогда ОбработатьНаСервере(Имя); КомандаСистемы("taskkill /F /IM excel.exe"); КонецЕсли; Сообщить(">>Обработан файл: " + Имя); Исключение Сообщить("!Возникли проблемы при обработке файла: " + Имя); КонецПопытки; |
Закрыть окно служебных сообщений
1 2 3 4 5 |
Процедура ЗакрытьОкноСлужебныеСообщения() ОкноСлСообщ = Новый COMОбъект("Wscript.shell"); ОкноСлСообщ.SendKeys("^+{z}"); ОкноСлСообщ.SendKeys("^+{я}"); КонецПроцедуры |
Строку в многострочную часть
1 2 3 4 5 6 7 8 9 10 11 12 |
Если ЗначениеЗаполнено(СокрЛП(Строка(ЛистExcel.Cells(Строка,2).Value))) Тогда ЛистExcel.Cells(Строка, 2).NumberFormat ="ДД.ММ.ГГГГ"; ДатаРождения = СокрЛП(Строка(ЛистExcel.Cells(Строка,2).Value)); ДатаРождения = СтрЗаменить(СокрЛП(ДатаРождения), ".", ""); ДатаРождения = Лев(ДатаРождения, 8); ГодР = Прав(СокрЛП(ДатаРождения), 4); МесяцР = Сред(СокрЛП(ДатаРождения), 3, 2); ЧислоР = Лев(СокрЛП(ДатаРождения), 2); ДатаРождения = Дата(ГодР, МесяцР, ЧислоР); КонецЕсли; |
или
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Функция ИзвлечьСлово(Строка, Разделитель) П = найти(Строка+Разделитель, Разделитель); Ответ = Лев(Строка, П-1); Строка = Сред(Строка, П+СтрДлина(Разделитель)); Возврат Ответ; КонецФункции Пример: стр = "1,2,3,4"; Сообщить(ИзвлечьСлово(стр, ",")); //1 Сообщить(стр); // 2,3,4 Сообщить(ИзвлечьСлово(стр, ",")); //2 Сообщить(стр); // 3,4 Сообщить(ИзвлечьСлово(стр, ",")); //3 Сообщить(стр); // 4 Сообщить(ИзвлечьСлово(стр, ",")); //4 Сообщить(стр); // "" (пустая строка) Сообщить(ИзвлечьСлово(стр, ",")); // "" (пустая строка) |
Парсить дату в строке
Определить дату из строки с пробелами
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
&НаСервере Функция ПарситьДатуВСтроке(Строка) Строка=СтрЗаменить(Строка(Строка)," ",Символы.ПС); ТекДата= ""; Для н=1 По СтрЧислоСтрок(Строка) Цикл ТекСтр= СокрЛП(СтрПолучитьСтроку(Строка,н)); Попытка ТекДата=Дата(Число(Сред(ТекСтр,7,4)), Число(Сред(ТекСтр,4,2)), Число(Лев(ТекСтр,2))); Если ЗначениеЗаполнено(ТекДата) Тогда ТекДата= ТекДата; КонецЕсли; Исключение КонецПопытки; КонецЦикла; Возврат ТекДата; КонецФункции |
Получить из перечисления
1 2 3 4 5 6 7 8 9 10 11 |
&НаСервереБезКонтекста Функция ПолучитьСтатус(Значение) Статус= Перечисления.СтатусыФизическихЛиц; Для Индекс = 0 По Статус.Количество() Цикл Если ВРег(Статус.Получить(Индекс))= ВРег(СокрЛП(Значение)) Тогда Возврат Статус.Получить(Индекс); КонецЕсли; КонецЦикла; КонецФункции |
Закрыть приложение (kill)
1 |
КомандаСистемы("taskkill /F /IM excel.exe"); |
Пинг
1 2 3 4 5 6 7 8 9 10 |
Функция Пинг(АдресURL = "") Если ПустаяСтрока(АдресURL) Тогда АдресURL = "www.ya.ru"; КонецЕсли; objShell = Новый COMОбъект("WScript.Shell") ; objScriptExec = objShell.Exec("ping.exe -n 1 " + АдресURL); strPingResults = НРег(objScriptExec.StdOut.ReadAll()); ЕстьСоединение = Найти(strPingResults, "ttl=") > 0; Возврат ЕстьСоединение; КонецФункции |
Быстрое описание типов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
Функция ОписаниеТипа(ИмяТипа, п1 = Неопределено, п2 = Неопределено, п3 = Неопределено) Перем Результат; Если ИмяТипа = "Строка" Тогда п1 = ?(п1 = Неопределено, 0, п1); Если п2 = Неопределено Тогда п2 = ДопустимаяДлина.Переменная; КонецЕсли; КвалСтроки = Новый КвалификаторыСтроки(п1, п2); Результат = Новый ОписаниеТипов(ИмяТипа,,,,КвалСтроки); ИначеЕсли ИмяТипа = "Число" Тогда п1 = ?(п1 = Неопределено, 0, п1); п2 = ?(п2 = Неопределено, 0, п2); Если п3 = Неопределено Тогда п3 = ДопустимыйЗнак.Любой; КонецЕсли; КвалЧисла = Новый КвалификаторыЧисла(п1, п2, п3); Результат = Новый ОписаниеТипов(ИмяТипа,,,КвалЧисла); ИначеЕсли ИмяТипа = "Дата" Тогда Если п1 = Неопределено Тогда п1 = ЧастиДаты.ДатаВремя; КонецЕсли; КвалДаты = Новый КвалификаторыДаты(п1); Результат = Новый ОписаниеТипов(ИмяТипа,,,,,КвалДаты); Иначе Результат = Новый ОписаниеТипов(ИмяТипа); КонецЕсли; Возврат Результат; КонецФункции Функция НоваяТаблицаОписанияОпераций() тз = Новый ТаблицаЗначений; тз.Колонки.Добавить("Сумма" , ОписаниеТипа("Число", 15, 2)); тз.Колонки.Вставить("Описание" , ОписаниеТипа("Строка", 100)); тз.Колонки.Вставить("ДатаОперации" , ОписаниеТипа("Дата")); МассивТипов = Новый Массив(); МассивТипов.Добавить(Тип("ДокументСсылка.Встреча")); МассивТипов.Добавить(Тип("ДокументСсылка.ЗапланированноеВзаимодействие")); тз.Колонки.Вставить("Событие" , ОписаниеТипа(МассивТипов)); тз.Колонки.Вставить("Ответственный" , ОписаниеТипа("СправочникСсылка.Пользователи")); Возврат тз; КонецФункции |
Свернуть заголовки табличной части
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Процедура СвернутьЗаголовкиШапкиТабличногоДокумента(ТабДок, ВысотаШапки = 0) ВысотаШапки = ?(ВысотаШапки = 0, ТабДок.ФиксацияСверху, ВысотаШапки); НачалоШапки = ?(ТабДок.ФиксацияСлева = 0, 1, ТабДок.ФиксацияСлева); Для СчетчикСтрок=1 По ВысотаШапки Цикл НомерПервойКолонкиОбъединения = 0; Для СчетчикКолонок=НачалоШапки По ТабДок.ШиринаТаблицы Цикл ОбъединятьЯчейки = Ложь; Ячейка = ТабДок.Область(СчетчикСтрок, СчетчикКолонок); Если ПустаяСтрока(Ячейка.Текст) Тогда Продолжить; КонецЕсли; ЯчейкаСлед = ТабДок.Область(СчетчикСтрок, СчетчикКолонок+1); ОбъединятьЯчейки = Ячейка.Текст = ЯчейкаСлед.Текст; Если ОбъединятьЯчейки Тогда НомерПервойКолонкиОбъединения = ?(НомерПервойКолонкиОбъединения = 0, СчетчикКолонок, НомерПервойКолонкиОбъединения); ИначеЕсли НомерПервойКолонкиОбъединения > 0 Тогда ТекстЗаголовка = ТабДок.Область(СчетчикСтрок, СчетчикКолонок).Текст; ОбъединяемаяОбласть = ТабДок.Область(СчетчикСтрок, НомерПервойКолонкиОбъединения, СчетчикСтрок, СчетчикКолонок); ОбъединяемаяОбласть.Объединить(); КоличествоКолонокВОбъединении = СчетчикКолонок - НомерПервойКолонкиОбъединения; ОбъединяемаяОбласть.ШиринаКолонки = ОбъединяемаяОбласть.ШиринаКолонки / КоличествоКолонокВОбъединении; ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр; ОбъединяемаяОбласть.Текст = ТекстЗаголовка; НомерПервойКолонкиОбъединения = 0; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры |
Преобразование табличного документа в таблицу значений
Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы по ссылке на объект.
1 |
ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) |
Пример:
1 |
РеквизитыКонтрагента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Контрагент, "Наименование, ИНН, КПП"); |
Скажете, что можно написать Контрагент.Наименование проще, чем обращаться к функции, но не многие знают, что обращение через точку считывает значение всех реквизитов объекта, что не производительно для объектов с реквизитами типа ХранилищеЗначения например.
Проверяет наличие ссылок на объект в базе данных
1 |
ОбщегоНазначения.ЕстьСсылкиНаОбъект(Знач СсылкаИлиМассивСсылок, Знач ИскатьСредиСлужебныхОбъектов = Ложь, ДругиеИсключения = Неопределено) |
Пример:
1 2 3 |
Если ОбщегоНазначения.ЕстьСсылкиНаОбъект(Контрагент) Тогда Продолжить; КонецЕсли; |
Можно использовать в своей обработке, например при удалении данных проверять ссылки, к тому же в отличии от встроенной функции НайтиСсылки, работает параметр ИсключаемыеОбъекты, что не есть плохо.
Позволяет определить, есть ли среди реквизитов объекта реквизит с переданным именем
1 |
ОбщегоНазначения.ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) |
Пример:
1 2 3 4 5 |
Для Каждого ДокументОбъект Из МассивДокументов Цикл Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Организация", ДокументОбъект.Метаданные()) Тогда ДокументОбъект.Организация = Организация; КонецЕсли; КонецЦикла; |
Получает файл из Интернета по протоколу http(s), либо ftp и сохраняет его по указанному пути на сервере.
1 |
ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(Знач URL, ПараметрыПолучения = Неопределено, Знач ЗаписыватьОшибку = Истина) |
Проверяет, является ли текущий или указанный пользователь полноправным.
1 |
Пользователи.ЭтоПолноправныйПользователь() |
Пример:
1 2 3 |
Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда ВызватьИсключение НСтр("ru = 'У Вас нет доступа!'"); КонецЕсли; |
Получает номер документа для вывода на печать; из номера удаляются префиксы и лидирующие нули
1 |
ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь) |
Пример:
1 2 |
НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать("УТПД-00023", Истина, Истина); //НомерНаПечать будет равен строке "23" |
Полезно для тех кто делает дополнительные печатные формы.
Возвращает курс валюты на дату.
1 |
РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, ДатаКурса) |
Пример:
1 2 |
//Получение курса валюты документа на 30 января 2014 года Курс = РаботаСКурсамиВалют.ПолучитьКурсВалюты(ВалютаДокумента, Дата(2014, 01, 30)); |
Подставляет параметры в строку. Максимально возможное число параметров — 9.
1 2 3 4 |
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) |
Очень полезная функция, номер параметра задается знаком процента, пример:
1 2 |
Шаблон = "Недостаточно номенклатуры %1 на складе %2 в количестве %3 шт."; ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Номенклатура, Склад, КоличествоОстаток); |
Советую более подробно посмотреть все функции модуля СтроковыеФункцииКлиентСервер.
Открывает Проводник Windows и выделяет указанный файл.
пример: «»С:\Temp\report.txt»
1 |
ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла) |
Запускает выполнение процедуры в фоновом задании
1 2 |
ДлительныеОперации.ЗапуститьВыполнениеВФоне(Знач ИдентификаторФормы, Знач ИмяЭкспортнойПроцедуры, Знач Параметры, Знач НаименованиеЗадания = "", ИспользоватьДополнительноеВременноеХранилище = Ложь) |
Будет полезно для операций длительных по времени, запустили и дали возможность пользователю работать дальше.
Для отображения состояния на клиенте существует метод:
1 |
ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(Знач ВладелецФормы, Знач ИдентификаторЗадания) |
Функции для работы со строками
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
Функция __естьПрефикс( строкаИсточник, Префикс) Экспорт Если __пустаяСтрока(Префикс) или __пустаяСтрока(строкаИсточник) или СтрДлина(Префикс) > СтрДлина(строкаИсточник) Тогда Возврат ложь; КонецЕсли; длинаСтр = СтрДлина(Префикс); Возврат Лев(строкаИсточник, длинаСтр)=Префикс; КонецФункции Функция __естьПостфикс( строкаИсточник, Постфикс ) Экспорт Если __пустаяСтрока(Постфикс) или __пустаяСтрока(строкаИсточник) или СтрДлина(Постфикс) > СтрДлина(строкаИсточник) Тогда Возврат ложь; КонецЕсли; длинаСтр = СтрДлина(Постфикс); Возврат Прав(строкаИсточник, длинаСтр)=Постфикс; КонецФункции Функция __получитьПодстроку(строкаИсточник, индексНачала, длинаПодстроки) Экспорт Возврат Сред( строкаИсточник, индексНачала, длинаПодстроки); КонецФункции Функция __удалитьПодстроку(строкаИсточник, подстрока) Экспорт строкаИсточник = СтрЗаменить( строкаИсточник, подстрока, ""); КонецФункции Функция __удалитьПодстрокуПоИндексу(строкаИсточник, индексНачала, длинаПодстроки) Экспорт строка11=""; строка21=""; строка12=""; строка22=""; __разделитьСтрокуПоИндексу(строкаИсточник, индексНачала, строка11, строка21); __разделитьСтрокуПоИндексу(строкаИсточник, индексНачала + длинаПодстроки, строка12, строка22); строкаИсточник = строка11 + строка22; КонецФункции Функция __вставитьПодстроку(строкаИсточник, подстрока, индескНачала) Экспорт строка1=""; строка2=""; Если Неопределено =__разделитьСтрокуПоИндексу(строкаИсточник, индескНачала, строка1, строка2) Тогда Возврат Неопределено; КонецЕсли; строкаИсточник = строка1 + подстрока + строка2; Возврат Истина; КонецФункции //возврат: две части, строки Функция __разделитьСтрокуПоИндексу( строкаИсточник, индескНачалаРазделения, строка1, строка2 ) Экспорт Если индескНачалаРазделения > СтрДлина(строкаИсточник) Тогда Возврат Неопределено; КонецЕсли; строка1 = Лев(строкаИсточник, индескНачалаРазделения); строка2 = Прав(строкаИсточник, СтрДлина(строкаИсточник) - индескНачалаРазделения +1 ); Возврат Истина; КонецФункции //возврат: две части, строки Функция __разделитьСтрокуПоПодстроке( строкаИсточник, ПодстрокаРазделения, строка1, строка2 ) Экспорт Если СтрДлина(ПодстрокаРазделения) > СтрДлина(строкаИсточник) или СтрДлина(ПодстрокаРазделения) = (СтрДлина(строкаИсточник)+1) Тогда Возврат Неопределено; КонецЕсли; индекс = __получитьИндексСтрокиПоСимволу(строкаИсточник, ПодстрокаРазделения); строка1 = Лев(строкаИсточник, индекс); строка2 = Прав(строкаИсточник, СтрДлина(строкаИсточник) - индекс - СтрДлина(ПодстрокаРазделения) +1 ); Возврат Истина; КонецФункции //возврат: при исключении возврат Неопределено Функция __получитьСимволСтрокиПоИндексу( строкаИсточник, индекс) Экспорт Возврат ?(индекс>СтрДлина(строкаИсточник), Неопределено, Сред(строкаИсточник, индекс, 1)); КонецФункции //возврат: при исключении возврат Неопределено Функция __получитьИндексСтрокиПоСимволу( строкаИсточник, символ) Экспорт индекс = Найти(строкаИсточник, символ); Возврат ?(индекс=0, Неопределено, индекс); КонецФункции //возврат: при исключении возврат Неопределено, иначе подстрока Функция __получитьПодстрокуПоСимволуИсключению(строкаИсточник, индексНачалаСканирования, символИсключения) Экспорт Если (индексНачалаСканирования+СтрДлина(символИсключения)) > СтрДлина(строкаИсточник) Тогда Возврат Неопределено; КонецЕсли; строка = Прав(строкаИсточник, СтрДлина(строкаИсточник) - индексНачалаСканирования +1); подстрока =""; Если СтрДлина(символИсключения) > 1 Тогда следСтрока = __получитьПодстроку(строка, 1, СтрДлина(символИсключения)); Пока не __пустаяСтрока(следСтрока) Цикл Если следСтрока<>символИсключения Тогда подстрока = подстрока + следСтрока; Иначе Прервать; КонецЕсли; __удалитьПодстрокуПоИндексу(строка, 1, СтрДлина(следСтрока) ); следСтрока = __получитьПодстроку(строка, 1, СтрДлина(символИсключения)); КонецЦикла; // Иначе Для н=1 По СтрДлина(строка) Цикл символ = __получитьСимволСтрокиПоИндексу(строка, н); Если символ<>символИсключения Тогда подстрока = подстрока + символ; Иначе Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Возврат подстрока; КонецФункции //возврат: при исключении возврат Неопределено Функция __удалитьСимволСтрокиПоИндексу( строкаИсточник, индекс) Экспорт длинаСтр = СтрДлина(строкаИсточник); Если индекс>длинаСтр Тогда Возврат Неопределено; КонецЕсли; левСтр = Лев(строкаИсточник, индекс -1 ); правСтр = Прав(строкаИсточник, длинаСтр - индекс); стр = левСтр + правСтр; Возврат стр; КонецФункции //возврат: многострочная строка // Функция __получитьМСтроку( строкаИсточник, строкаРазделитель, строкаИсключения=Неопределено, ПовторятьСтрокуРазделителя=Ложь ) Экспорт стр = СтрЗаменить( строкаИсточник, строкаРазделитель, Символы.ПС); резСтр = ""; Если Неопределено=строкаИсключения Тогда Возврат стр; КонецЕсли; //исключение заданной строки из многострочной строки колво = СтрЧислоСтрок(стр); Для н=1 По колво Цикл текСтр = СтрПолучитьСтроку(стр, н); Если не ПовторятьСтрокуРазделителя и текСтр<>строкаИсключения Тогда __сформироватьПодстрокуМСтроки(резСтр, текСтр); Если не __пустаяСтрока(текСтр) или текСтр<>строкаИсключения Тогда __сформироватьПодстрокуМСтроки(резСтр, текСтр); КонецЕсли; КонецЕсли; КонецЦикла; Возврат резСтр; КонецФункции //раскладывает на подстроки //возврат: массив подстрок Функция __получитьСтрокуВМассив(строкаИсточник, строкаРазделитель, строкаИсключения=Неопределено, ПовторятьСтрокуРазделителя=Ложь) Экспорт массив = Новый Массив; стр = строкаИсточник; ДлинаРазделителя = СтрДлина(строкаРазделитель); Пока истина Цикл Поз = Найти(Стр, строкаРазделитель); Если Поз=0 Тогда текСтр = Стр; // Если не ПовторятьСтрокуРазделителя и текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); Иначе Если не __пустаяСтрока(текСтр) или текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); КонецЕсли; КонецЕсли; // Возврат массив; КонецЕсли; текСтр = Лев(Стр, Поз-1); // Если не ПовторятьСтрокуРазделителя и текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); Иначе Если не __пустаяСтрока(текСтр) или текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); КонецЕсли; КонецЕсли; // Стр = Сред( Стр, Поз+ДлинаРазделителя ); КонецЦикла; Возврат массив; КонецФункции Функция __этоМСтрока(строкаИсточник) Экспорт Возврат ( Найти(строкаИсточник, Символы.ПС)<>0 ); КонецФункции Функция __получитьМСтрокуВМассив(строкаИсточник, строкаИсключения=Неопределено)Экспорт массив = Новый Массив; колво = СтрЧислоСтрок(строкаИсточник); Для н=1 По колво Цикл текСтр = СтрПолучитьСтроку(строкаИсточник, н); Если строкаИсключения<>Неопределено и текСтр<>строкаИсключения Тогда массив.Добавить( текСтр ); КонецЕсли; КонецЦикла; Возврат массив; КонецФункции Функция __получитьМСтрокуИзМассива(массивИсточник, строкаИсключения=Неопределено)Экспорт стр = ""; Для каждого элемент Из массивИсточник Цикл Если __этоСтрока(элемент) и строкаИсключения<>Неопределено и элемент<>строкаИсключения Тогда __сформироватьПодстрокуМСтроки(стр, элемент); КонецЕсли; КонецЦикла; Возврат стр; КонецФункции Функция __получитьСтрокуИзМассива(массивИсточник, строкаРазделитель="", строкаИсключения=Неопределено) Экспорт стр = ""; былоВхождение = Ложь; Для каждого элемент Из массивИсточник Цикл Если __этоСтрока(элемент) и строкаИсключения<>Неопределено и элемент<>строкаИсключения Тогда стр = стр + элемент + строкаРазделитель; былоВхождение=Истина; КонецЕсли; КонецЦикла; Если былоВхождение Тогда __удалитьПодстрокуПоИндексу(стр, СтрДлина(стр)-СтрДлина(строкаРазделитель), СтрДлина(строкаРазделитель) ); КонецЕсли; //убираем лишний разделитель Возврат стр; КонецФункции Процедура __сформироватьПодстрокуМСтроки( строкаИсточник, подСтрока )Экспорт строкаИсточник = строкаИсточник + подСтрока + Символы.ПС; КонецПроцедуры |
Склонение должности и ФИО
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
// Получение Должности для текста, подписи // ПолучитьДолжностьСписок(ктоЭто_,Падеж=0,тип=0) // Параметры: // КтоЭто_ : - строка : "директор, директора, директору" // Падеж : - 1-Именительный,2- родительный,3- дательный. // Тип : - 0- первая буква БОЛЬШАЯ ВРЕГ : "Директор", 1 - маленькая НРЕГ : "директор" // &НаСервере Функция ПолучитьДолжностьСписок(ктоЭто_,Падеж=0,тип=0) Если Падеж=0 тогда Падеж=1;конецесли; Должность=""; Если значениезаполнено(ктоЭто_) тогда // страховка ктоэто__=стрЗаменить(ктоэто_," ",""); ктоэто=стрЗаменить(ктоэто__," ",""); Если СтрЧислоВхождений(ктоЭто,",") >0 тогда // три варианта по падежам - обязательно // Именительный Где=Найти(КтоЭто,","); Первый=Лев(КтоЭто,где-1) ; остаток2=сред(КтоЭто,где+1,стрдлина(ктоЭто)) ; // родительный Где=Найти(остаток2,","); второй=Лев(остаток2,где-1) ;остаток3=сред(остаток2,где+1,стрдлина(остаток2)); // дательный третий= остаток3; Если Падеж=1 тогда Должность=Первый ; иначеЕсли Падеж=2 тогда Должность=второй ; иначе Должность=третий ; конецесли; Если тип=0 тогда Должность=Врег(сред(Должность,1,1)) +Нрег(сред(Должность,2,стрдлина(Должность)-1)) ; иначе Должность=нрег(сред(Должность,1,1)) +Нрег(сред(Должность,2,стрдлина(Должность)-1)) ; конецесли; конецесли; конецесли; возврат Должность; Конецфункции // Получение фамилии для текста, подписи // ПолучитьФИОСписок(ктоЭто_,Падеж=0,тип=0) // Параметры: // КтоЭто_ : - строка : "Иванов Иван Иванович, Иванова Ивана Ивановича, Иванову Ивану Ивановичу" // Падеж : - 1-Именительный,2- родительный,3- дательный. // Тип : - 0- кратко : "Иванов И.И.", 1 - полно : "Иванов Иван Иванович" // &НаСервере Функция ПолучитьФИОСписок(ктоЭто_,Падеж=0,тип=0) Если Падеж=0 тогда Падеж=1;конецесли; Подписант=""; Если значениезаполнено(ктоЭто_) тогда // страховка ктоэто__=стрЗаменить(ктоэто_," "," "); ктоэто = стрЗаменить(ктоэто_," "," "); Если СтрЧислоВхождений(ктоЭто,",") >0 тогда // три варианта по падежам - обязательно // найдем свой падеж // 1 Именительный Где=Найти(КтоЭто,","); Первый=Лев(КтоЭто,где-1) ; остаток2=сред(КтоЭто,где+1,стрдлина(ктоЭто)) ; // 2 родительный Где=Найти(остаток2,","); второй=Лев(остаток2,где-1) ; остаток3=сред(остаток2,где+1,стрдлина(остаток2)) ; // 3 дательный третий= остаток3; Если Падеж=1 тогда Подписант=Первый ; иначеЕсли Падеж=2 тогда Подписант=второй ; иначе Подписант=третий ; конецесли; // по умолчанию : Иванов Иван Иванович Где=Найти(Подписант," "); Фамилия=Лев(Подписант,где-1) ; остаток2=сред(Подписант,где+1,стрдлина(Подписант)) ; Где=Найти(остаток2," "); Имя=Лев(остаток2,где-1) ; Остаток3=сред(остаток2,где+1,стрдлина(остаток2)) ; Отчество= остаток3; Если тип = 0 тогда // Если нужно кратко Иванов И. И. Подписант= Фамилия+" "+ Врег(лев(Имя,1))+"."+вРег(Лев(Отчество,1))+"."; конецесли; конецесли; конецесли; возврат Подписант; Конецфункции |
Фрагмент программного кода :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Это основной вариант, берем данные из справочников ФиоКлиент=Ссылка.клиент.ДиректорОрганизации ; ФиоБрокер=Ссылка.Организация.Директор ; // Это замена подписанта и где надо по тексту документа Если Значениезаполнено(ссылка.ФиоКлиент) тогда ФиоКлиент = ПолучитьФИОСписок(ссылка.ФиоКлиент,2,1) ; конецЕсли; Если Значениезаполнено(ссылка.ФиоБрокер) тогда ФиоБрокер = ПолучитьФИОСписок(ссылка.ФиоБрокер,2,1) ; конецЕсли; |
или
1 2 3 4 5 6 |
//1 = Именительный (КТО? ЧТО?) //2 = Родительный (КОГО?ЧЕГО?) //3 = Дательный (КОМУ? ЧЕМУ?) //4 = Винительный (КОГО? ЧТО?) //5 = Творительный (КЕМ? ЧЕМ?) //6 = Предложный (О КОМ? О ЧЕМ?) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Функция СклонятьНаСервере(НачальноеНаименование, Падеж) НужнаяФорма = Ложь; Запрос = ""; Существительное = НачальноеНаименование; //Заменим пробелы в строке на %20 для успешного запроса Запрос = СтрЗаменить(Существительное, " ", "%20"); //Сгенерируем УРЛ и путь для получаемого ответа в виде XML Путь = КаталогВременныхФайлов() + "sklon.xml"; url = "/inflect.xml?name=" + СокрЛП(Запрос); HTTP = Новый HTTPСоединение("export.yandex.ru"); //Записываем ответ сервера в xml файл HTTP.Получить(url, Путь); //Парсим XML файл Файл = Новый ЧтениеXML; Файл.ОткрытьФайл(Путь); Пока Файл.Прочитать() Цикл Если Файл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда Пока Файл.ПрочитатьАтрибут() Цикл //Номер падежа является значением в атрибуте "case" Попытка Если Число(Файл.Значение) = Падеж Тогда //Число(Падеж) НужнаяФорма = Истина; КонецЕсли; Исключение Файл.Закрыть(); УдалитьФайлы(Файл); Возврат Существительное; КонецПопытки; КонецЦикла; КонецЕсли; Если Файл.ТипУзла = ТипУзлаXML.Текст И НужнаяФорма Тогда НужнаяФорма = Ложь; Существительное = Файл.Значение; Прервать; КонецЕсли; Если Файл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда КонецЕсли; КонецЦикла; Файл.Закрыть(); УдалитьФайлы(Файл); Возврат Существительное; КонецФункции |
Число прописью
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
Процедура КнопкаВыполнитьНажатие(Кнопка) Сообщить(ЧислоПрописьюСвойСпособ(ЧислоДляПреобразования)); КонецПроцедуры //функция получения числа прописью Функция ЧислоПрописьюСвойСпособ(Знач ЧислоП) Если ЧислоП < 0 Тогда // число по модулю ЧислоП = ЧислоП*-1; КонецЕсли; ЧислоППрописью = ""; //Вторая часть задания:"но программа должна ЛЕГКО расширяться для добавления больших чисел". Начало. //Если ЧислоП >= 1000000000000 Тогда // Количество = Цел(ЧислоП/ 1000000000000); //ЧислоППрописью = СложитьСтроки(ЧислоППрописью,ЧислоСтрокой2(Количество)); //прописью сколько триллионов // Если Количество = 1 Тогда // ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "триллион") // ИначеЕсли Количество = 2 Тогда // ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "триллиона") // Иначе // ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "триллионов") // КонецЕсли; // ЧислоП = ЧислоП - Цел(ЧислоП / 1000000000000) * 1000000000000 //КонецЕсли; // //Если ЧислоП >= 1000000000 Тогда // Количество = Цел(ЧислоП/ 1000000000); // ЧислоППрописью = СложитьСтроки(ЧислоППрописью,ЧислоСтрокой2(Количество)); //прописью сколько миллиардов // Если Количество = 1 Тогда // ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "миллиард") // ИначеЕсли Количество = 2 Тогда // ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "миллиарда") // Иначе // ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "миллиардов") // КонецЕсли; // ЧислоП = ЧислоП - Цел(ЧислоП / 1000000000) * 1000000000 //КонецЕсли; //Вторая часть задания:"но программа должна ЛЕГКО расширяться для добавления больших чисел". Окончание. Если ЧислоП >= 1000000 Тогда Количество = Цел(ЧислоП/1000000); //сколько миллионов ЧислоППрописью = СложитьСтроки(ЧислоППрописью,ЧислоСтрокой2(Количество)); //прописью сколько миллионов Если Количество = 1 Тогда ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "миллион") ИначеЕсли Количество = 2 Тогда ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "миллиона") Иначе ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "миллионов") КонецЕсли; ЧислоП = ЧислоП - Цел(ЧислоП / 1000000) * 1000000 // для миллионов все сделали, далее нужно определить количество тысяч КонецЕсли; Если ЧислоП >= 1000 Тогда Количество = Цел(ЧислоП/1000); //определить количество тысяч ЧислоППрописью = СложитьСтроки(ЧислоППрописью,ЧислоСтрокой2(Количество)); //прописью тысячи Если Количество = 1 Тогда ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "тысяча") ИначеЕсли Количество = 2 Тогда ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "тысячи") Иначе ЧислоППрописью = СложитьСтроки(ЧислоППрописью, "тысяч") КонецЕсли; ЧислоП = ЧислоП - Цел(ЧислоП / 1000) * 1000 КонецЕсли; Если ЧислоП >= 0 Then ЧислоППрописью = СложитьСтроки(ЧислоППрописью, ЧислоСтрокой2(ЧислоП)) КонецЕсли; Возврат ЧислоППрописью; КонецФункции //возвращает строкове представление числа с разрадностью 3 Функция ЧислоСтрокой2(Знач Количество) ЧислоП = ""; Если Количество >= 100 Тогда ЧислоП = ЧислоСтрокой(Цел(Количество/100)*100); Количество = Количество - Цел(Количество / 100) * 100; КонецЕсли; Если Количество >= 20 Тогда ЧислоП = СложитьСтроки(ЧислоП, ЧислоСтрокой(Цел(Количество/10) * 10)); Количество = Количество - Цел(Количество / 10) * 10; КонецЕсли; ЧислоП = СложитьСтроки(ЧислоП, ЧислоСтрокой(Количество)); Возврат ЧислоП; КонецФункции //возвращает строковое представление числа Функция ЧислоСтрокой(Число) Если Число = 100 Тогда ЧислоСтрокой = "сто" ИначеЕсли Число = 200 Тогда ЧислоСтрокой = "двести" ИначеЕсли Число = 300 Тогда ЧислоСтрокой = "триста" ИначеЕсли Число =400 Тогда ЧислоСтрокой = "четыреста" ИначеЕсли Число = 500 Тогда ЧислоСтрокой = "пятьсот" ИначеЕсли Число = 600 Тогда ЧислоСтрокой = "шестьсот" ИначеЕсли Число = 700 Тогда ЧислоСтрокой = "семьсот" ИначеЕсли Число = 800 Тогда ЧислоСтрокой = "восемьсот" ИначеЕсли Число = 900 Тогда ЧислоСтрокой = "девятьсот" ИначеЕсли Число = 11 Тогда ЧислоСтрокой = "одиннадцать" ИначеЕсли Число = 12 Тогда ЧислоСтрокой = "двенадцать" ИначеЕсли Число = 13 Тогда ЧислоСтрокой = "тринадцать" ИначеЕсли Число = 14 Тогда ЧислоСтрокой = "четырнадцать" ИначеЕсли Число = 15 Тогда ЧислоСтрокой = "пятнадцать" ИначеЕсли Число = 16 Тогда ЧислоСтрокой = "шестнадцать" ИначеЕсли Число = 17 Тогда ЧислоСтрокой = "семнадцать" ИначеЕсли Число = 18 Тогда ЧислоСтрокой = "восемнадцать" ИначеЕсли Число = 19 Тогда ЧислоСтрокой = "девятнадцать" ИначеЕсли Число = 20 Тогда ЧислоСтрокой = "двадцать" ИначеЕсли Число = 30 Тогда ЧислоСтрокой = "тридцать" ИначеЕсли Число = 40 Тогда ЧислоСтрокой = "сорок" ИначеЕсли Число = 50 Тогда ЧислоСтрокой = "пятьдесят" ИначеЕсли Число = 60 Тогда ЧислоСтрокой = "шестьдесят" ИначеЕсли Число = 70 Тогда ЧислоСтрокой = "семьдесят" ИначеЕсли Число = 80 Тогда ЧислоСтрокой = "восемьдесят" ИначеЕсли Число = 90 Тогда ЧислоСтрокой = "девяносто" ИначеЕсли Число = 10 Тогда ЧислоСтрокой = "десять" ИначеЕсли Число = 9 Тогда ЧислоСтрокой = "девять" ИначеЕсли Число = 8 Тогда ЧислоСтрокой = "восемь" ИначеЕсли Число = 7 Тогда ЧислоСтрокой = "семь" ИначеЕсли Число = 6 Тогда ЧислоСтрокой = "шесть" ИначеЕсли Число = 5 Тогда ЧислоСтрокой = "пять" ИначеЕсли Число = 4 Тогда ЧислоСтрокой = "четыре" ИначеЕсли Число = 3 Тогда ЧислоСтрокой = "три" ИначеЕсли Число = 2 Тогда ЧислоСтрокой = "два" ИначеЕсли Число = 1 Тогда ЧислоСтрокой = "один" КонецЕсли; Возврат ЧислоСтрокой; КонецФункции //конкатенация двух строк Функция СложитьСтроки(Строка1, Строка2) Если Строка1 = "" Тогда СложитьСтроки = Строка2; ИначеЕсли Строка2 = "" Тогда СложитьСтроки = Строка1 Иначе СложитьСтроки = Строка1 + " " + Строка2 КонецЕсли; Возврат СложитьСтроки; КонецФункции //при открытии формы обработки Процедура ПриОткрытии() ЧислоДляПреобразования = 411211241; КонецПроцедуры |
Работа с массивом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
Функция Сумма(Массив) Экспорт Если Массив.Количество() = 0 Тогда Возврат 0 КонецЕсли; ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Сумма"); Для ё = 1 по Массив.Количество() Цикл ТЗ.Добавить(); КонецЦикла; ТЗ.ЗагрузитьКолонку(Массив, "Сумма"); Сумма = ТЗ.Итог("Сумма"); Возврат Сумма; КонецФункции Функция Минимум(Массив) Экспорт Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли; УпорядочитьМассив(Массив); Возврат Массив[0]; КонецФункции Функция Среднее(Массив) Экспорт Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли; Возврат Сумма(Массив) / Массив.Количество(); КонецФункции Функция Максимум(Массив) Экспорт Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли; УпорядочитьМассив(Массив); Возврат Массив[Массив.Количество() - 1]; КонецФункции Функция Медиана(Массив) Экспорт Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли; КоличествоЭлементов = Массив.Количество(); Если КоличествоЭлементов = 1 Тогда Возврат Массив[0]; ИначеЕсли КоличествоЭлементов = 2 Тогда Возврат Среднее(Массив); КонецЕсли; УпорядочитьМассив(Массив); Середина = КоличествоЭлементов / 2; Если Середина = Цел(Середина) Тогда Медиана = (Массив[Середина - 1] + Массив[Середина]) / 2; Иначе Медиана = Массив[Середина - 0.5] КонецЕсли; Возврат Медиана; КонецФункции Функция Дисперсия(Массив) Экспорт Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли; Среднее = Среднее(Массив); Сумма = 0; Для каждого Значение из Массив Цикл Сумма = Сумма + Pow((Значение - Среднее), 2); КонецЦикла; Дисперсия = Сумма / Массив.Количество(); Возврат Дисперсия; КонецФункции Функция СреднеКвадратичноеОтклонение(Массив) Экспорт Если Массив.Количество() = 0 Тогда Возврат Неопределено КонецЕсли; Дисперсия = Дисперсия(Массив); Возврат ?(Дисперсия < 0, 0, Sqrt(Дисперсия)); КонецФункции Процедура УпорядочитьМассив(Массив) Экспорт СЗ = Новый СписокЗначений; СЗ.ЗагрузитьЗначения(Массив); СЗ.СортироватьПоЗначению(НаправлениеСортировки.Возр); Массив = СЗ.ВыгрузитьЗначения(); КонецПроцедуры Функция МинимумКП(МассивПолный, МассивТекущий, ПроцентОтклонения, ВернутьКоличество = Ложь) Экспорт Минимум = Минимум(МассивПолный); ПроцентХ = Минимум / 100 * (100 + ПроцентОтклонения); сч = 0; Для каждого Значение из МассивТекущий Цикл Если Значение >= Минимум и Значение <= ПроцентХ Тогда Если ВернутьКоличество Тогда сч = сч + 1; Иначе Возврат Истина; КонецЕсли; КонецЕсли; КонецЦикла; Если ВернутьКоличество Тогда Возврат сч КонецЕсли; Возврат Ложь; КонецФункции Функция МаксимумКП(МассивПолный, МассивТекущий, ПроцентОтклонения, ВернутьКоличество = Ложь) Экспорт Максимум = Максимум(МассивПолный); ПроцентХ = Максимум / 100 * (100 - ПроцентОтклонения); сч = 0; Для каждого Значение из МассивТекущий Цикл Если Значение >= ПроцентХ и Значение <= Максимум Тогда Если ВернутьКоличество Тогда сч = сч + 1; Иначе Возврат Истина; КонецЕсли; КонецЕсли; КонецЦикла; Если ВернутьКоличество Тогда Возврат сч КонецЕсли; Возврат Ложь; КонецФункции |
Выборка из регистра и исправление записи
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХарактеристикиФизлиц.Период, | ХарактеристикиФизлиц.ФизическоеЛицо КАК ФизическоеЛицоСРФ |ИЗ | РегистрСведений.ХарактеристикиФизлиц КАК ХарактеристикиФизлиц |ГДЕ | ХарактеристикиФизлиц.Гражданство = &Страна | |УПОРЯДОЧИТЬ ПО | ХарактеристикиФизлиц.Период УБЫВ"; Запрос.УстановитьПараметр("Страна", Страна); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Период= ВыборкаДетальныеЗаписи.Период; ФизическоеЛицо= ВыборкаДетальныеЗаписи.ФизическоеЛицоСРФ; НаборЗаписей = РегистрыСведений.ХарактеристикиФизлиц.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Период.Установить(Период); НаборЗаписей.Отбор.ФизическоеЛицо.Установить(ФизическоеЛицо); НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() = 0 Тогда Запись= РегистрыСведений.ХарактеристикиФизлиц.СоздатьМенеджерЗаписи(); Запись.Период = ТекущаяДата(); Запись.ФизическоеЛицо = ФизическоеЛицо; Запись.Гражданство= ПолучитьСсылкуНаСтрану("Россия"); Запись.Записать(); Сообщить("Создана запись для " + ФизическоеЛицо); ИначеЕсли НаборЗаписей.Количество() >= 1 Тогда Запись= НаборЗаписей[0]; Запись.Гражданство= ПолучитьСсылкуНаСтрану("Россия"); НаборЗаписей.Записать(); Сообщить("Редактирована запись для " + ФизическоеЛицо); КонецЕсли; КонецЦикла; |
Очистить документы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
&НаСервере Процедура ОчиститьСведенияОбОбучающемсяНаСервере() ВыборкаДокументов = Документы.СведенияОбОбучающемся.Выбрать(); Пока ВыборкаДокументов.Следующий() Цикл Док = ВыборкаДокументов.ПолучитьОбъект(); Док.УстановитьПометкуУдаления(Истина); Док.Записать(); КонецЦикла; Док = Документы.СведенияОбОбучающемся.Выбрать(); Пока Док.Следующий()Цикл Док.ПолучитьОбъект().Удалить(); КонецЦикла; Сообщить("Журнал документов очищен"); ЗакрытьОкноСлужебныеСообщения(); КонецПроцедуры |
Получить ссылку
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
&НаСервереБезКонтекста Функция ПолучитьСсылкуНаФакультет(Факультет) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Факультеты.Ссылка |ИЗ | Справочник.Факультеты КАК Факультеты |ГДЕ | Факультеты.Код = &Факультет"; Запрос.УстановитьПараметр("Факультет", СокрЛП(Факультет)); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); ФакультетСсылка = Справочники.Факультеты.ПустаяСсылка(); Пока Выборка.Следующий() Цикл ФакультетСсылка = Выборка.Ссылка; КонецЦикла; Если ФакультетСсылка = Справочники.Факультеты.ПустаяСсылка() Тогда СправочникФакультетов = Справочники.Факультеты.СоздатьЭлемент(); СправочникФакультетов.Код = Факультет; СправочникФакультетов.Записать(); ФакультетСсылка = ПолучитьСсылкуНаФакультет(Факультет); КонецЕсли; Возврат ФакультетСсылка; КонецФункции |
СКД пронумеровать группировку
Необходимо в настройках добавить системное поле «Номер по порядку» и для групп тоже (см. пример на картинке). И так для каждой группировки которую необходимо нумеровать.
СКД свернуть
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) // СВЕРНУТАЯ ГРУППИРОВКА СТРОК СтандартнаяОбработка = Ложь; КомпоновщикМакет = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакет.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); //ДокументРезультат.ПоказатьУровеньГруппировокСтрок(2); //Уровень 3 //ДокументРезультат.ПоказатьУровеньГруппировокСтрок(1); //Уровень 2 ДокументРезультат.ПоказатьУровеньГруппировокСтрок(0); //Уровень 1 КонецПроцедуры |
Разность между датами
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РАЗНОСТЬДАТ(&ДатаНач, &ДатаКон, МЕСЯЦ) КАК РазностьДат. | РАЗНОСТЬДАТ(&ДатаНач, &ДатаКон, ДЕНЬ) КАК Дней |"; Запрос.УстановитьПараметр("ДатаНач", Отчет.ДатаНач); Запрос.УстановитьПараметр("ДатаКон", Отчет.ДатаКон); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Месяцев = Выборка.РазностьДат; |
Исправление циклической ссылки
Сервис — Проверка наличия ошибок
Выгрузить результат запроса в табличную часть
1 |
Список.Загрузить(Запрос.выполнить().Выгрузить()); |
Увеличить дату на день вперед
1 |
КонецДня(<дата>)+1 |
или
1 |
НачалоДня(Дата + 60*60*24) |
Прибавить год
1 |
ДобавитьМесяц(КонецГодаВыпуска,12) |
В запросе добавить к дате
1 |
ДОБАВИТЬКДАТЕ(<Исходная Дата>, <Единица Измерения>, <Количество>) |
1 |
ДОБАВИТЬКДАТЕ(НДФЛДоходыПредыдущегоМесяца.МесяцНалоговогоПериода, МЕСЯЦ, 1))«; |
Прочесть параметр из СКД и изменить другой параметр
1 2 3 4 5 6 7 8 |
ПараметрДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период"); ПараметрДанных.Использование = Истина; ПараметрПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрДанных.ИдентификаторПользовательскойНастройки); КонецГодаВыпуска = ПараметрПользовательскойНастройки.Значение.ДатаНачала; ПараметрДанныхУстановить= КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаГодПослеОкончания"); ПараметрДанныхУстановить.Значение = Дата(ДобавитьМесяц(КонецГодаВыпуска,12)); ПараметрДанныхУстановить.Использование=Истина; |
Удалить повторяющиеся записи из массива
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Функция УдалитьПовторяющиесяЭлементыМассива(Массив) Экспорт ТекущийИндекс = 0; ВсегоЭлементов = Массив.Количество(); Пока ТекущийИндекс < ВсегоЭлементов Цикл Индекс2 = ТекущийИндекс + 1; Пока Индекс2 < ВсегоЭлементов Цикл Если Массив[Индекс2] = Массив[ТекущийИндекс] Тогда Массив.Удалить(Индекс2); ВсегоЭлементов = ВсегоЭлементов - 1; Иначе Индекс2 = Индекс2 + 1; КонецЕсли; КонецЦикла; ТекущийИндекс = ТекущийИндекс + 1; КонецЦикла; Возврат Массив; КонецФункции |
Выделить дату из даты времени
1 |
НачалоДня(ДатаСВременем) |
Организация выпадающего списка
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Диплом.Ссылка |ИЗ | Документ.Диплом КАК Диплом |ГДЕ | Диплом.ФизическоеЛицо = &ФизическоеЛицо"; Запрос.УстановитьПараметр("ФизическоеЛицо", Объект.ФизическоеЛицо); Результат = Запрос.Выполнить().Выбрать(); N=0; Пока Результат.Следующий() Цикл ЭтаФорма.Элементы.Специальность.СписокВыбора.Вставить(N, Результат.Ссылка.ПарусСпециальность); //ВЫПАДАЮЩИЙ СПИСОК N=N+1; КонецЦикла; ЭтаФорма.Элементы.Специальность.РежимВыбораИзСписка = ИСТИНА; |
Форматирование на печать
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
ТабДок.ИмяПринтера="HP LaserJet 3050 Series PCL 6"; // указать имя принтера ТабДок.РазборПоКопиям=истина; // разобрать по копиям ТабДок.КоличествоЭкземпляров=5; // количество копий ТабДок.ПолеСлева=20;//Поле слева 20мм, остальные поля 10мм (по умолчанию) ТабДок.ОриентацияСтраницы=ОриентацияСтраницы.Ландшафт; ТабДок.ЭкземпляровНаСтранице=2; //на листе будет размещено 2 страницы ТабДок.Автомасштаб=истина; //аналогично настройкам масштаба «по ширине страницы» //При необходимости можно указать конкретное значение масштабирования в процентах (свойство «МасштабПечати»). //Свойство «РазмерСтраницы» позволяет задать стандартные форматы страницы – “A3”, “A4”, “A5” (полный список вариантов доступен в справке 1С). ТабДок.РазмерСтраницы="A3";// буква А должна быть английской //Для нестандартного размера бумаги (Custom) можно указать значения высоты и ширины страницы (в мм): ТабДок.РазмерСтраницы="Custom";//нестандартный размер ТабДок.ВысотаСтраницы=350; ТабДок.ШиринаСтраницы=350; //Также в табличном документе доступно управление выводом колонтитулов и их содержимым. Для этого служат свойства «ВерхнийКолонтитул» и «НижнийКолонтитул». Например: ТабДок.ВерхнийКолонтитул.Выводить=истина; //будет напечатан верхний колонтитул ТабДок.РазмерКолонтитулаСверху=7; //размер колонтитула 7мм (по умолчанию 10мм) ТабДок.ВерхнийКолонтитул.ВертикальноеПоложение=ВертикальноеПоложение.Верх; ТабДок.ВерхнийКолонтитул.НачальнаяСтраница=2;//колонтитул выводится со второй страницы ШрифтКолонтитула=Новый Шрифт("Courier New", 8,,Истина); ТабДок.ВерхнийКолонтитул.Шрифт=ШрифтКолонтитула; //наклонный шрифт ТабДок.ВерхнийКолонтитул.ТекстВЦентре="Верхний колонтитул"; ТабДок.ВерхнийКолонтитул.ТекстСправа="Стр.[&НомерСтраницы] из [&СтраницВсего]"; //нумерация страниц ТабДок.ВерхнийКолонтитул.ТекстСлева="[&Дата]";//текущая дата //Сформированный документ отправляется на печать с помощью метода «Напечатать()». Возможно два варианта вызова. //1) Непосредственно на принтер: ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать); ТабДок.Напечатать(истина); //2) Перед печатью будет выведен диалог печати: ТабДок.Напечатать(РежимИспользованияДиалогаПечати.Использовать); ТабДок.Напечатать(ложь); //Кроме того можно управлять и разбиением документа на страницы. Оценить количество страниц в документе по настройкам текущего принтера можно так: ТабДок.КоличествоСтраниц(); //С помощью методов «ПроверитьВывод()» и «ПроверитьПрисоединение()» можно определить, умещается ли табличный документ или массив областей табличного документа на странице в высоту и в ширину при текущих настройках принтера. //Надо иметь ввиду, что работа последних трех методов зависит от установленного принтера. Если методу не удается его найти, вызывается исключение. //Принудительно вставить разрывы страниц позволяют методы «ВывестиВертикальныйРазделительСтраниц()» и «ВывестиГоризонтальныйРазделительСтраниц()». //Таким образом, можно управлять постраничным выводом на печать и контролировать заполнение страницы: Если Не ТабДок.ПроверитьВывод(МассивВыводимыхОбластей) Тогда ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; |
Изменение видимости состава панели функций текущего раздела
Элемент метаданных — ПКМ — Дополнительно — Командный интерфейс — Отключение для роли
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
/// Пример работы с xml в 1с 8.3, 8.2 Процедура ПримерРаботыСXML() // запись XML XML = Новый ЗаписьXML; XML.ОткрытьФайл("d:\Базы 1С\Data.xml"); XML.ЗаписатьОбъявлениеXML(); XML.ЗаписатьНачалоЭлемента("Корень"); XML.ЗаписатьНаалоЭлемента("Город"); XML.ЗаписатьНачалоАтрибута("Название"); XML.ЗаписатьТекст("Хабаровск"); XML.ЗаписатьКонецАтрибута(); XML.ЗаписатьНачалоАтрибута("Численность"); XML.ЗаписатьТекст("600000"); XML.ЗаписатьКонецАтрибута(); XML.ЗаписатьКонецЭлемента(); XML.ЗаписатьКонецЭлемента(); XML.Закрыть(); // чтение XML XML = Новый ЧтениеXML; XML.ОткрытьФайл("d:\Базы 1С\Data.xml"); Пока XML.Прочитать() Цикл Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда Сообщить("<" + XML.Имя + ">"); Пока XML.ПрочитатьАтрибут() Цикл Сообщить(XML.Имя + " = " + XML.Значение); КонецЦикла; КонецЕсли; Если XML.ТипУзла = ТипУзлаXML.Текст Тогда Сообщить(XML.Значение); КонецЕсли; Если XML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда Сообщить(""); КонецЕсли; КонецЦикла; XML.Закрыть(); КонецПроцедуры /// Пример работы с текстовым документом в 1с 8.3, 8.2 Процедура Пример_ТекстовыйДокумент() // создание и запись в текстовый документ Текст = Новый ТекстовыйДокумент; Текст.ДобавитьСтроку("Первая строка документа!"); Текст.ЗаменитьСтроку(1, "Замена первой строки!"); // нумерация с 1 Текст.ВставитьСтроку(2, "Вторая строка!"); Текст.Записать("Пример.txt", КодировкаТекста.ANSI, Символы.ПС); //Текст.Показать(); // откроет текст в редакторе // чтение текстового документа Текст = Новый ТекстовыйДокумент; Текст.Прочитать("Пример.txt", КодировкаТекста.ANSI, Символы.ПС); Для Номер = 1 По Текст.КоличествоСтрок() Цикл Сообщить(Текст.ПолучитьСтроку(Номер)); КонецЦикла; // как удалить строку из документа Текст.УдалитьСтроку(1); // как очистить текст Текст.Очистить(); КонецПроцедуры /// Как работать с zip архивами в 1с 8.3, 8.2 Процедура Пример_РаботыСZipАрхивами() // создание архива и добавление файла Архив = Новый ЗаписьZipФайла("C:\Архив.zip"); Архив.Добавить("c:\Документ.doc"); Архив.Записать(); // открытие и распаковка архива Архив = Новый ЧтениеZipФайла("C:\Архив.zip"); Архив.ИзвлечьВсе("C:\РаспакованныйАрхив"); КонецПроцедуры /// Как работать с хранилищем значения в 1с 8.3, 8.2 Процедура Пример_РаботыСХранилищемЗначения() // создадим хранилище для хранение картинки в базе МояКартинка = Новый Картинка("C:\Картинка.bmp"); ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка); // теперь мы можем сохранить это хранилище в одном из полей базы Номенклатура = Справочники.Номенклатура.СоздатьЭлемент(); Номенклатура.Наименование = "Стул"; Номенклатура.Изображение = ХранилищеКартинки; Номенклатура.Записать(); // затем, мы можем всегда извлечь его МояКартинка = ХранилищеКартинки.Получить(); КонецПроцедуры /// Как работать с двоичными данными в 1с 8.3, 8.2 Процедура Пример_РаботыСДвоичнымиДанными() Данные = Новый ДвоичныеДанные("c:\Картинка.png"); Сообщить(Данные.Размер()); // можно сохранить их в хранилище значений Данные.Записать("c:\binary_data"); КонецПроцедуры /// Как производить хеширование данных в 1с 8.3, 8.2 Процедура Пример_ХешированиеДанных() Хеш = Новый ХешированиеДанных(ХешФункция.CRC32); Хеш.ДобавитьФайл("c:\Картинка.png"); Сообщить(Хеш.ХешСумма); Хеш.ДобавитьФайл("c:\Документ.doc"); Сообщить(Хеш.ХешСумма); // Хеш.Добавить(ДвоичныеДанные); КонецПроцедуры /// Как сгенерировать случайное числе в 1с 8.3, 8.2 Процедура Пример_ГенераторСлучайныхЧисел() // инициализируем временем работы ОС ГСЧ = Новый ГенераторСлучайныхЧисел(); Сообщить(ГСЧ.СлучайноеЧисло(0, 1)); // инициализируем своим числом ГСЧ = Новый ГенераторСлучайныхЧисел(0); Сообщить(ГСЧ.СлучайноеЧисло(1, 100)); КонецПроцедуры /// Как показать сообщение пользователю с /// привязкой к элементу формы в 1с 8.3, 8.2 Процедура Пример_СообщениеПользователюСПривязкой() // Сообщение.КлючДанных = Ссылка на объект базы или ключ записи // Сообщение.ПутьКДанным = содержит путь в форме до объекта. // показываем сообщение из обработки // КлючДанных и ПутьКДанным - пустые Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Комментарий"; Сообщение.Текст = "Заполните комментарий"; Сообщение.Сообщить(); // показываем сообщение из документа // КлючДанных - пустой, ПутьКДанным заполнится автоматически Сообщение = Новый СообщениеПользователю; Сообщение.Поле = "Товары[0].Количество"; Сообщение.Текст = "Не заполнено количество товара в первой строке!"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецПроцедуры /// Как получить системную информацию в 1с 8.3, 8.2 Процедура Пример_ПолученияСистемнойИнформации() СисИнфо = Новый СистемнаяИнформация; // версия операционной системы Сообщить(СисИнфо.ВерсияОС); // версия приложения Сообщить(СисИнфо.ВерсияПриложения); // количество оперативной памяти Сообщить(СисИнфо.ОперативнаяПамять); // тип процессора Сообщить(СисИнфо.Процессор); // тип платформы Сообщить(СисИнфо.ТипПлатформы); КонецПроцедуры /// Как работать со списком пользователей в 1с 8.3, 8.2 Процедура Пример_РаботаСоСпискомПользователей() // как получить список пользователей Пользователи = ПользователиИнформационнойБазы. ПолучитьПользователей(); Для Каждого Пользователь Из Пользователи Цикл Сообщить(Пользователь.Имя); // перечислим роли пользователя Для Каждого Роль Из Пользователь.Роли Цикл Сообщить(" >>" + Роль); КонецЦикла; КонецЦикла; // как получить текущего пользователя Сообщить(ПользователиИнформационнойБазы.ТекущийПользователь()); // как создать нового пользователя Ползователь = ПользователиИнформационнойБазы.СоздатьПользователя(); Пользователь.Имя = "Васечкин А.В."; Пользователь.Пароль = "123"; Пользователь.Роли.Добавить(Метаданные.Роли.Администратор); //Пользователь.Записать(); // как найти пользователя по имени Пользователь = ПользователиИнформационнойБазы. НайтиПоИмени("Васечкин А.В."); // как удалить пользователя //Пользователь.Удалить(); // как узнать являюсь ли я администратором Сообщить( ПользователиИнформационнойБазы. ТекущийПользователь().Роли.Содержит( Метаданные.Роли.Администратор)); КонецПроцедуры |
Отбор в форме списка
1 2 3 4 5 6 |
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номер"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; ЭлементОтбора.Использование = Истина; ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; ЭлементОтбора.ПравоеЗначение = "000000001"; |
Аналог ЭтоНовый() в управляемом приложении
1 |
Параметры.Ключ.Пустая(); |
Переключение на КонсольЗапросов
В запросе с предложениями РАЗЛИЧНЫЕ или ОБЪЕДИНИТЬ нельзя использовать поля неограниченной длины
1 |
ВЫРАЗИТЬ(Организация.КонтактнаяИнформация КАК СТРОКА(200)) КАК КонтактнаяИнформация |
Удаление записей в независимом регистре сведений
1 2 3 |
НаборЗаписей = РегистрыСведений.ОбъектыСтроительстваОрганизаций.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Организация.Установить(УдаляемаяОрганизация); НаборЗаписей.Записать(); |
Настройка начальной страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Процедура НастройкаНачальнойСтраницы(ВариантОтображения) НастройкаНачальнойСтраницы = ХранилищеСистемныхНастроек.Загрузить("Общее/НастройкиНачальнойСтраницы"); Если НастройкаНачальнойСтраницы = Неопределено Тогда НастройкаНачальнойСтраницы = Новый НастройкиНачальнойСтраницы; КонецЕсли; Если НастройкаНачальнойСтраницы <> Неопределено Тогда НовыйСоставФорм = Новый СоставФормНачальнойСтраницы; Если НЕ ВариантОтображения= "НеЗаполнять" Тогда ТекущийСоставФорм = НастройкаНачальнойСтраницы.ПолучитьСоставФорм(); Для Каждого НастройкаЛеваяКолонка Из ТекущийСоставФорм.ЛеваяКолонка Цикл НовыйСоставФорм.ЛеваяКолонка.Добавить(НастройкаЛеваяКолонка); КонецЦикла; Для Каждого НастройкаПраваяКолонка Из ТекущийСоставФорм.ПраваяКолонка Цикл Если НастройкаПраваяКолонка = «Обработка.Меню.Форма.Форма» Тогда Продолжить; КонецЕсли; НовыйСоставФорм.ПраваяКолонка.Добавить(НастройкаПраваяКолонка); КонецЦикла; Если ДобавитьМеню Тогда НовыйСоставФорм.ПраваяКолонка.Добавить(«Обработка.Меню.Форма.Форма»); КонецЕсли; КонецЕсли; НастройкаНачальнойСтраницы.УстановитьСоставФорм(НовыйСоставФорм); ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиНачальнойСтраницы",, НастройкаНачальнойСтраницы); КонецЕсли; КонецПроцедуры |
Свернуть табличную часть
1 2 3 |
ОбъектЗначение = РеквизитФормыВЗначение ("Объект"); ОбъектЗначение.ПользователиРоли.Свернуть("Пометка, ПользовательИмя, ПользовательСиноним"); ЗначениеВРеквизитФормы (ОбъектЗначение,"Объект"); |
Порядок в общих модулях
Вообще идеология должна быть следующая:
— если модулю установлен флаг «клиент (управляемое приложение)» — в нем должны находиться только процедуры, выполняемые на клиенте, никакие директивы перед процедурами не нужны;
— если стоит флга «Сервер» — то соответственно только серверные процедуры;
— если стоит флаг «ВызовСервера» и «Сервер», то данные процедуры и функции (экспортные) можно вызывать с клиента;
— если стоит флаг «Клиент» и «Сервер», то должны быть процедуры, у которых не важно откуда будет вызываться — с клиента или с сервера, в таких процедурах нельзя использовать особенности серверного контекста (использовать запросы) и тд. то есть например процедуры работы со строками и подобные;
Добавить колонки в ТаблицаЗначений
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
&НаСервере Процедура СоздатьТаблицуЗначенийВРеквизитеФормы(Форма, ИмяРеквизитаФормы, ТаблицаЗначений) МассивДобавляемыхРеквизитов = Новый Массив; МассивДобавляемыхПолей = Новый Массив; Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Объект.ИнформационноеСообщениеВК.", Колонка.Заголовок)); НоваяКолонка = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), Элементы.ИнформационноеСообщениеВК); МассивДобавляемыхПолей.Добавить(НоваяКолонка); КонецЦикла; ИзменитьРеквизиты( |