Функция ПОДСТРОКА() В языке запросов 1С:Предприятия функция
ПОДСТРОКА() в
формате ПОДСТРОКА(<Исходная строка>, <Начало>, <Длина>) может применяться к данным строкового типа и позволяет выделить фрагмент <Исходной строки>, начинающийся с символа номер <Начало> (символы в строке нумеруются с 1) и длиной <Длина> символов. Результат вычисления функции ПОДСТРОКА() имеет строковый тип переменной длины, причем длина будет считаться неограниченной, если <Исходная строка> имеет неограниченную длину и параметр <Длина> не является константой или превышает 1024.
Вычисление функции ПОДСТРОКА() на SQL сервере:
В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется.
В большинстве случаев эти правила не оказывают влияния на выполнение запроса 1С:Предприятия, однако есть случаи, когда для исполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса.
Например, запрос:
Код 1C v 8.х ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NUL L
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NUL L
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
завершается аварийно с сообщением Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618
Это происходит потому, что вычисленная Microsoft SQL Server максимальная длина строки, которая является результатом выражения:
Код 1C v 8.х ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NUL L
КОНЕЦ КАК Представление,
равна 4000 символов. Поэтому длина записи, состоящей из двух таких полей превышает 8000 байт, разрешенные для выполнения операции сортировки.
В связи с описанной особенностью исполнения функции SUBSTRING() на SQL Server использование функции ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины не рекомендуется. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ(). В частности, приведенный пример можно переписать в виде:
Код 1C v 8.х ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NUL L
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NUL L
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
Категория:
Запросы Как в 7.7 прочитать файл *.csv в UTF-8 Код 1C v 7.x Процедура Сформировать()
Перем Имя,Путь;
Если ФС.ВыбратьФайл(0,Имя,Путь,"","*.*|*.*","*")=0 Тогда
Возврат;
КонецЕсли;
Файл=Путь+Имя;
Стрим=СоздатьОбъект("ADODB.Stream");
Стрим.Type=2;
Стрим.charset="windows-1251";
Стрим.Open();
Стрим.LoadFromFile(Файл);
Стрим.charset="utf-8";
Стр=Лев(Стрим.ReadText(),255);
Сообщить(Стр);
КонецПроцедуры
// еще способ
Процедура Сформировать()
Перем Имя,Путь;
Если ФС.ВыбратьФайл(0,Имя,Путь,"","*.*|*.*","*")=0 Тогда
Возврат;
КонецЕсли;
Файл=Путь+Имя;
УТФ16=КаталогВременныхФайлов()+_GetPerformanceCounter()+"-unicode.txt";
ЦП1251=КаталогВременныхФайлов()+_GetPerformanceCounter()+"-cp1251.txt";
БАТ=КаталогВременныхФайлов()+_GetPerformanceCounter()+".bat";
Стр="@echo off
|chcp 1251 > nul
|chcp 65001 |>> """+УТФ16+""" cmd /u /c ""type """+Файл+""" & chcp 1251 > nul ""
|chcp 1251 > nul
|type """+УТФ16+""" > """+ЦП1251+"""
|chcp 866 > nul ";
Текст=СоздатьОбъект("Текст");
Текст.ДобавитьСтроку(Стр);
Текст.Записать(БАТ);
КомандаСистемы(БАТ);
Текст=СоздатьОбъект("Текст");
Текст.Открыть(ЦП1251);
Для Сч=1 По Текст.КоличествоСтрок() Цикл
Сообщить(Лев(Текст.ПолучитьСтроку(Сч),255));
КонецЦикла;
ФС.УдалитьФайл(УТФ16);
ФС.УдалитьФайл(ЦП1251);
ФС.УдалитьФайл(БАТ);
КонецПроцедуры
Посмотрите еще:
Функции перекодировки текста в/из UTF-8 штатными средствами 1с 7.7 Категория:
COM-объекты, WMI, WSH Загрузка данных в 1С из FoxPro Deggy пишет:
Так сейчас так веду импорт из FoxPro-шных таблиц в восьмерку. Вот например заполнение справочника стран:
Код 1C v 8.х НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=\\192.168.***.***\server\baza\;
|Exclusive=No; Collate=Machine;NUL L=NO;DELETED=YES;BACKGROUNDFETCH=NO;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
RS = Новый COMОбъект("ADODB.RecordSet");
RS.Open("Select * from country where !deleted()",Connect);
пока RS.EOF()=0 цикл
Если Число(RS.Fields("cntry_code").Value)>0 тогда
РезультатПоиска = Справочники.КлассификаторСтранМира.НайтиПоКоду(Число(RS.Fields("cntry_code").Value));
Если РезультатПоиска.Пустая() Тогда
НоваяСтрана = Справочники.КлассификаторСтранМира.СоздатьЭлемент();
НоваяСтрана.Код =Число(RS.Fields("cntry_code").Value);
НоваяСтрана.Наименование = СокрЛП(RS.Fields("cntry_name").Value);
НоваяСтрана.Записать();
Иначе
НайденнаяСтрана=РезультатПоиска.ПолучитьОбъект();
НайденнаяСтрана.Наименование=СокрЛП(RS.Fields("cntry_name").Value);
НайденнаяСтрана.Записать();
Сообщить("Страна с кодом "+ СокрЛП(RS.Fields("cntry_code").Value)+ "уже существует");
конецесли;
КонецЕсли;
сообщить("-------------------");
Сообщить(СокрЛП(RS.Fields("cntry_code").Value)+" " + СокрЛП(RS.Fields("cntry_name").Value));
RS.MoveNext();
КонецЦикла;
RS.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
Категория:
Конвертация данных, Обмен, Перенос Чем отличается значение типа Неопределено и значение типа Nul l? Значение типа Неопределено используется прежде всего как значение по умолчанию (незаданное значение) для полей с составным типом. Например, если есть реквизит, который имеет составной тип, включающий СправочникСсылка.Товары и СправочникСсылка.Материалы , то значением реквизита по умолчанию будет Неопределено. Так же это значение используется и в других случаях для обозначения неуказанного значения.
Значение типа Nul l используется при работе с таблицами прикладных объектов. Оно обозначает отсутствие значения поля в выборке. Прежде всего оно используется в результатах запросов выполняющих левое или правое соединение. Поля невыбранных записей таблиц участвующих в таких соединениях будут иметь значение Nul l . Кроме того, значение типа Nul l будет иметь, например, реквизит иерархического справочника для элементов-групп, если в метаданных указано, что этот реквизит используется только для элементов не являющихся группами.
Категория:
Встроенные Функции Создать, заменить, записать файл в Хранилище Значения Код 1C v 8.х Функция СоздатьФайлВХранилище(ЛокПолноеИмяФайла,ЛокНаименованиеЭлемента)Экспорт
Попытка
ЛокХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ЛокПолноеИмяФайла));
Исключение
Возврат Nul l;
КонецПопытки;
ЛокСправочникХЗН = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
ЛокСправочникХЗН.Наименование = ЛокНаименованиеЭлемента;
ЛокСправочникХЗН.Хранилище = ЛокХранилище;
Попытка
ЛокСправочникХЗН.Записать();
Возврат ЛокСправочникХЗН;
Исключение
Возврат Nul l;
КонецПопытки;
КонецФункции
Функция ЗаменаФайлаВХранилище(ЛокПолноеИмяФайла,ЛокНаименованиеЭлемента) Экспорт
Попытка
ЛокХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ЛокПолноеИмяФайла));
Исключение
Возврат Nul l;
КонецПопытки;
ЛокСправочникХЗНСсылка = Справочники.ХранилищеДополнительнойИнформации.НайтиПоНаименованию(ЛокНаименованиеЭлемента);
Если ЛокСправочникХЗНСсылка.Пустая() Тогда
Возврат Nul l;
КонецЕсли;
ЛокСправочникХЗН = ЛокСправочникХЗНСсылка.ПолучитьОбъект();
ЛокСправочникХЗН.Хранилище = ЛокХранилище;
Попытка
ЛокСправочникХЗН.Записать();
Возврат ЛокСправочникХЗН;
Исключение
Возврат Nul l;
КонецПопытки;
КонецФункции
Функция ЗаписатьФайлИзХранилища(ЛокПолноеИмяФайла,ЛокНаименованиеЭлемента) Экспорт
Попытка
ЛокСпр = Справочники.ХранилищеДополнительнойИнформации.НайтиПоНаименованию(ЛокНаименованиеЭлемента);
ЛокСпр.Хранилище.Получить().Записать(ЛокПолноеИмяФайла);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Функция СоздатьВременныйФайлИзХранилища(ЛокНаименованиеЭлемента,ЛокРасширение)
ЛокПолноеИмяФайла = КаталогВременныхФайлов()+ПолучитьИмяВременногоФайла(ЛокРасширение);
Если ЗаписатьФайлИзХранилища(ЛокПолноеИмяФайла,ЛокНаименованиеЭлемента) Тогда
Возврат ЛокПолноеИмяФайла;
Иначе
Возврат Nul l;
КонецЕсли;
КонецФункции
Категория:
Работа с Хранилищем Значений Загрузка данных из MS Excel через объект ADODB Данный метод обладает гораздо большей производительностью и простотой, чем банальный объектный метод через COM соединение.
Все что потребуется это создание 2 объектов
* ADODB.Connection
* ADODB. Recordset
Код 1C v 8.х // Выполняет загрузку из файла Excel
// Параметры
// ПутьКФайлу - <Строка> - путь к файлу xls
// Автор: ---%%%Gmix 16.03.2006 12:38:48
// Возвращаемое значение:
// <Булево> – Истина загрузка произошла
// - Ложь загрузки не было
Функция ВыполнитьЗагрузку(ПутьКФайлу) Экспорт
Файл=Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда
Стр_Файл=Файл.ПолноеИмя;
// Отрезаем слеш если он есть в конце пути
Стр_Путь=Файл.Путь;
Если Прав(Стр_Путь,1)="\" Тогда
Стр_Путь=Лев(Стр_Путь,СтрДлина(Стр_Путь)-1);
КонецЕсли;
// Строка корнекта
Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};
|DriverId=790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";
Об_Конект = Новый COMОбъект("ADODB.Connection");
Попытка
Об_Конект.Open(Стр_Конект);
Исключение
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+Стр_Файл+"] открыт другим пользователем.");
Возврат Ложь;
КонецПопытки;
// формируем запрос
// Здесь есть нюанс первая строка данных всегда будет являться заголовком
// если она пустая то имена клонок формируются следующим образом F<Номер колонки>
Стр_SQL = "S_elect
| F1 as Артикул,
| F2 as Наименование,
| F3 as ПолноеНаименование
| FROM [A1:AZ100000]
| WHERE ((F1 Is Not Nul l) AND (F1 <>''))";
Об_РекордСет = Новый COMОбъект("ADODB.Recordset");
Попытка
Об_РекордСет=Об_Конект.Execute(Стр_SQL);
Исключение
Сообщить("Не удадлось выполнить запрос к файлу Excel
|"+ ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ Об_РекордСет.EOF Цикл
// Получаем данные из Об_РекордСет
// ...
Сообщить("");
Для каждого ОБ_Поле Из Об_РекордСет.Fields Цикл
// Пример вывода информации Сообщить(ОБ_Поле.Name,Об_РекордСет.Fields(ОБ_Поле.Name).value);
КонецЦикла;
// ...
Об_РекордСет.MoveNext();
КонецЦикла;
Об_Конект.Close(); // Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Возврат Истина;
Иначе
Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Пример чтения текста в кодировке ISO Код 1C v 7.x
Функция Перекодировка(Стр="",Кодировка="windows-1251")
Стрим = СоздатьОбъект("Adodb.Stream");
Стрим.Type = 2;
Стрим.Mode= 3;
Стрим.charset="iso-8859-5";
Стрим.Open();
Стрим.WriteText(Стр);
Стрим.Position=0;
Стрим.charset=Кодировка;
Рез=Стрим.ReadText(-1);
Стрим.Close();
Возврат Рез;
КонецФункции
//Если предыдущая функция не срабатывает, то попробуйте:
Стрим = СоздатьОбъект("Adodb.Stream");
Стрим.charset="iso-8859-5";
Стрим.Open();
Стрим.LoadFromFile("c:\WORK\H R\PSHRR848.C");
Стрим.Position=0; // здесь уже можно дергать нормальный текст
Стрим2 = СоздатьОбъект("Adodb.Stream");
Стрим2.charset="windows-1251";
Стрим2.Open();
Стрим2.WriteText(Стрим.ReadText);
Стрим2.Position=0;
Рез=Стрим2.ReadText(-1);
Стрим.Close();
Стрим2.Close();
//Выведем в Сообщить результаты
Message("2 = "+Рез);
Message("StrLen(Рез) = "+StrLen(Рез));
// Кратко
Стрим = СоздатьОбъект("Adodb.Stream");
Стрим.charset="iso-8859-5";
Стрим.Open();
Стрим.LoadFromFile("c:\WORK\H R\PSHRR848.C");
Рез=Стрим.ReadText();
Код 1C v 7.x //Код где, ни единого объекта. smaharbA
Процедура Сформировать()
Стр="Нажрися вотки и закуси ка селедкой! ";
База=""+_GetPerformanceCounter()+".txt";
УТФ=КаталогВременныхФайлов()+"УТФ"+База;
ИСО=КаталогВременныхФайлов()+"ИСО"+База;
ДОС=КаталогВременныхФайлов()+"ДОС"+База;
ОбратноДОС=КаталогВременныхФайлов()+"ОбратноДОС"+База;
Текст=СоздатьОбъект("Текст");
Текст.КодоваяСтраница(1);
Для Сч=1 По 10 Цикл
Текст.ДобавитьСтроку(Стр);
КонецЦикла;
Текст.Записать(ДОС);
Текст.Очистить();
КомандаСистемы("chcp 28595 > nul & echo off 2> """+ИСО+""" & for /f ""delims="" %i in ("+ДОС+") do (chcp 28595|>> """+ИСО+""" echo %i)");
// КомандаСистемы("cmd /c ""chcp 28595|> """+ИСО+""" echo "+Стр+"""");
Текст.КодоваяСтраница(0);
Текст.ДобавитьСтроку(Симв(255)+Симв(254));
Текст.Записать(УТФ);
КомандаСистемы("chcp 28595|> nul echo & cmd /u /c type """+ИСО+""" >> """+УТФ+"""");
КомандаСистемы("type """+УТФ+""" > """+ОбратноДОС+"""");
Текст.КодоваяСтраница(1);
Текст.Открыть(ОбратноДОС);
Для Сч=1 По Текст.КоличествоСтрок() Цикл
Сообщить(Текст.ПолучитьСтроку(Сч));
КонецЦикла;
КонецПроцедуры
Категория:
Полезные, Универсальные Функции Отчет Список работавших... с использованием СКД ( Обширный пример ) Нужен Отчет, в котором было бы видно, кто и из какой организации к нам пришел?
Эти данные хранятся в Табличной части "Трудовая деятельность" справочника "ФизическиеЛица", еще нужно вывести в отчет текущую Должность и Подразделение(Выводить ПолноеНаименование, т.е со всеми родителями) работника из регистра сведений "Работники орагнизации" и получить из документа "ПриемНаРаботуВОрганизацию" Дату приема и номер документа.
1. Создаем новый отчет, открываем СКД и добавляем набор данных Запрос. Согласно нашим требованиям формируем запрос:
Код 1C v 8.х ВЫБРАТЬ
ФизическиеЛицаТрудоваяДеятельность.Ссылка,
ФизическиеЛицаТрудоваяДеятельность.НомерСтроки,
ФизическиеЛицаТрудоваяДеятельность.Организация,
ФизическиеЛицаТрудоваяДеятельность.ДатаНачала,
ФизическиеЛицаТрудоваяДеятельность.ДатаОкончания,
ФизическиеЛицаТрудоваяДеятельность.Должность КАК ДолжностьТруд,
ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка.Номер,
ПриемНаРаботуВОрганизациюРаботникиОрганизации.Ссылка.Дата,
РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации,
РаботникиОрганизацийСрезПоследних.Должность КАК Должность,
РаботникиОрганизацийСрезПоследних.Сотрудник.Код,
ПриемНаРаботуВОрганизациюРаботникиОрганизации.ДатаПриема,
РаботникиОрганизацийСрезПоследних.Организация КАК ОрганизацияГлавная,
ВЫБОР
КОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Наименование ЕСТЬ NUL L
ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Наименование
КОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Родитель.Наименование ЕСТЬ NUL L
ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Наименование + " / " + РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Наименование
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Родитель.Наименование + " / " + РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Наименование + " / " + РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Наименование
КОНЕЦ КАК ПолныйКод
ИЗ
Справочник.ФизическиеЛица.ТрудоваяДеятельность КАК ФизическиеЛицаТрудоваяДеятельность
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних КАК РаботникиОрганизацийСрезПоследних
ПО ФизическиеЛицаТрудоваяДеятельность.Ссылка = РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботуВОрганизацию.РаботникиОрганизации КАК ПриемНаРаботуВОрганизациюРаботникиОрганизации
ПО ФизическиеЛицаТрудоваяДеятельность.Ссылка = ПриемНаРаботуВОрганизациюРаботникиОрганизации.ФизЛицо.Ссылка
2. Переходим в закладку Настройки, Заполняем Выбранные поля Добавляем к отчету пустую группировку:
3. В итоге должно получиться:
4. Сохраняем и проверяем отчет, уже что-то формируется
:
5. Теперь сделаем отчет красивым. Добавим отбор по организации на форме, и создадим макет вывода. Создадим основную форму отчета, кроме существующих Элементов панели и Табличного документа "Результат" добавим на форму "ТабличноеПоле" и установим Данные: "КомпоновщикНастроек.Настройки.Отбор"
6. Откроем СКД, закладку Макеты. В табличном поле Нарисуем макет, в левом верхнем поле Добавим макет Группировки "ЗаголовокОтчета:Заголовок" и "СтрокаОтчета:Заголовок". В нижнем левом поле опишем Параметры макета, для "СтрокаОтчета:Заголовок":
7. На закладке Настройки, добавим группировки "ОрганизацияГлавная" и входящая в нее "Детальные записи". Щелкнув правой клавишей мыши на каждой группировке и выбрав из меню пункт "Установить имя..." установим именя областей созданного макета. Заполним Выбранные поля:
8. Внизу на закладке "Отбор" установим:
9. Сохраним отчет и проверим его работу, все ок
Автор:
Евгений Мигачев Категория:
Схема Компоновки Данных Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID Когда кто-то удаляет данные из базы без проверки ссылок на эти объекты, то везде где этот объект использовался появляется сообщение вида: <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824) .
В данной статье я опишу пример быстрого восстановления данных.
Для пользователя:
Скачиваете эту обработку восстановления объектов по GUID :
Для 1С 8.1:
здесь или
Скачивать файлы может только зарегистрированный пользователь!
Для 1С 8.2:
Скачивать файлы может только зарегистрированный пользователь!
!!! Новая Версия!!! 8.2 и 8.3 -
Скачивать файлы может только зарегистрированный пользователь! Подробное описание:
Объект не найден в 1С или про Битые ссылки 1С
и открываете ее в программе:
1. Копируем фразу <Объект не найден... и вставляем в поле Объект не найден, жмем на кнопку GUID -> и получаем 05dbe824-a4c6-11dd-bf56-00145e3710ab
2. Если Вы знаете что удалили, то можете сразу нажать кнопку Создать Объект Из GUID - Пункт 4.
3. Если Вы не знаете что удалили, тогда вам нужно поднять архивную копию базы, открыть там обработку и вставить полученный GUID в поле GUID.
далее нажать Ссылку -> и в правом поле отобразится необходимый Вам объект(в моем случае Попов Роман Владимирович).
Открыв его, узнаем что это справочник Сотрудники и всю содержащуюся в справочнике информацию. Возвращаемся в базу, где необходимо восстановить объект и жмем кнопку Создать Объект Из GUID
4. Из открывшегося списка выбираем Справочник Сотрудники, в открывшейся форме заполняем все поля данными из архивной базы и жмем OK. Все, данный объект восстановлен.
Для быстрого поиска всех <Объект не найден> используйте
Поиск в базе битых ссылок - "объект не найден"
Для программиста:
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х ГУИДССЫЛКИ = СсылкаНаОбъект.УникальныйИдентификатор();
Для того чтобы преобразовать <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824) в УникальныйИдентификатор (GUID)
Код 1C v 8.х // ГУИДУдОбъкта = <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824)
ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъкта,"<Объект не найден> (","");
ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъктаСтр,")","");
ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъктаСтр,"0x","");
ГУИДУдОбъктаСтр = Сред(ГУИДУдОбъктаСтр, Найти(ГУИДУдОбъктаСтр,":")+1, СтрДлина(ГУИДУдОбъктаСтр));
// Преобразуем GUID
ГУИД = Сред(ГУИДУдОбъктаСтр,25,8)+"-"+Сред(ГУИДУдОбъктаСтр,21,4)+"-"+Сред(ГУИДУдОбъктаСтр,17,4)+"-"+Сред(ГУИДУдОбъктаСтр,1,4)+"-"+Сред(ГУИДУдОбъктаСтр,5,12); //и получаем ГУИД = 05dbe824-a4c6-11dd-bf56-00145e3710ab
Для получения ссылки по уникальному идентификатору, используйте код:
Код 1C v 8.х // ГУИД = 05dbe824-a4c6-11dd-bf56-00145e3710ab
// Ссылка будет установлена в переменную СсылкаНаОбъектГуид
УникальныйИдентификатор = Новый УникальныйИдентификатор(ГУИД)
// все объекты по которым можно получить ссылку
Если ПолучитьСсылкуНоМенеджеруОбъекта(Справочники,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(Документы,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыВидовХарактеристик,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыСчетов,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыОбмена,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(БизнесПроцессы,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(Задачи,УникальныйИдентификатор) Тогда
КонецЕсли;
// ПолучитьСсылкуНоМенеджеруОбъекта()
Функция ПолучитьСсылкуНоМенеджеруОбъекта(ОбъектыМенеджер,УникальныйИдентификатор)
Для Каждого Менеджер Из ОбъектыМенеджер Цикл
СсылкаНаОбъектГуид = Менеджер.ПолучитьСсылку(УникальныйИдентификатор);
Если СсылкаНаОбъектГуид.ПолучитьОбъект() <> Неопределено Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Создать объект документ или справочник и установить ему свой Уникальный идентификатор
Код 1C v 8.х // ТекGUID = 05dbe824-a4c6-11dd-bf56-00145e3710ab
Попытка
УникальныйИд = Новый УникальныйИдентификатор(ТекGUID);
Исключение
Возврат;
КонецПопытки;
КартинкаСпр=БиблиотекаКартинок.Справочник;
КартинкаДок=БиблиотекаКартинок.Документ;
СписокВыбора = Новый СписокЗначений;
СписокВыбора.Добавить(nul l,"СПРАВОЧНИКИ");
Для каждого ЭлементМетаданных Из Метаданные.Справочники Цикл
Структурка=Новый Структура;
Структурка.Вставить("Имя",ЭлементМетаданных.Имя);
Структурка.Вставить("Тип",1);
СписокВыбора.Добавить(Структурка,ЭлементМетаданных.Синоним,,КартинкаСпр);
КонецЦикла;
СписокВыбора.Добавить(nul l,"ДОКУМЕНТЫ");
Для каждого ЭлементМетаданных Из Метаданные.Документы Цикл
Структурка=Новый Структура;
Структурка.Вставить("Имя",ЭлементМетаданных.Имя);
Структурка.Вставить("Тип",2);
СписокВыбора.Добавить(Структурка,ЭлементМетаданных.Синоним,,КартинкаДок);
КонецЦикла;
Результат=СписокВыбора.ВыбратьЭлемент("Выберите тип ссылки");
Если Результат=Неопределено Тогда
Возврат;
КонецЕсли;
Структурка=Результат.Значение;
Если Структурка=nul l Тогда
Возврат;
КонецЕсли;
НовыйОбъект=Неопределено;
Если Структурка.Тип=1 Тогда
Объект=Справочники[Структурка.Имя].СоздатьЭлемент();
Объект.ОбменДанными.Загрузка=Истина;
Объект.УстановитьСсылкуНового(Справочники[Структурка.Имя].ПолучитьСсылку(УникальныйИд));
Иначе
Объект=Документы[Структурка.Имя].СоздатьДокумент();
Объект.ОбменДанными.Загрузка=Истина;
Объект.УстановитьСсылкуНового(Документы[Структурка.Имя].ПолучитьСсылку(УникальныйИд));
КонецЕсли;
Форма=Объект.ПолучитьФорму();
Форма.Открыть();
Для 1С 7.7 смотрите:
Технология восстановления удаленных объектов или элементов в 1С 7.7
еще можно получить ИдентификаторДокумента при OLE доступе:
Код 1C v 7.x Если Док_Источник.ВыбратьДокументы(ВыбНачПериода,ВыбКонПериода) = 1 Тогда
Пока Док_Источник.ПолучитьДокумент() = 1 Цикл
Объект = БазаОле.ЗначениеВстрокуВнутр(Док_Источник.ТекущийДокумент());
ИдентификаторДокумента = СокрЛП(ПолучитьИД(Объект));
// Для примера Объект возвращает {"O","0","0","3114","0","0"," 258156CB "},
// а ПолучитьИД(объект) = 258156CB
КонецЦикла;
Еще посмотрите метод:
ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> - значение объекта агрегатного типа данных которое нужно преобразовать.
Подробнее см. в документации, глава ''Системные процедуры и функции''
Категория:
1С Общие вопросы - Обычные формы Пример подключения к базе 1С 7.7 из 1С 8.0-8.1 Код 1C v 8.х // Переменная База - строка содержащая путь к базе 1С 7.7
// Возвращает переменную содержащую в себе COM-объект 1С 7.7
Функция ПодключитьсяКOLE(База)
Попытка
v7 = Новый COMObject("V1CEnterprise.Application");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Nul l;
КонецПопытки;
Попытка
Открыта = v7.Initialize(v7.RMTrade, "/D""" + База+ """ /M ", "NO_SPLASH_SHOW");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Nul l;
КонецПопытки;
Если Не Открыта Тогда
Сообщить(ОписаниеОшибки());
Возврат Nul l;
КонецЕсли;
Возврат v7;
КонецФункции
Экземпляр COM-объекта 1С 7.7 уничтожается (по завершению работы с ним) следующим образом:
Код 1C v 8.х v7 = "";
Категория:
COM-объекты, WMI, WSH Функция проверяет орфографию переданного текста с помощью средств MS Word Код 1C v 8.х // Проверка орфоргафии переданного текста с помощью средств MS Word
// Параметры
// <Текст> – <Строка> – проверяемый текст
// <ДеревоЗначений> – <ДеревоЗначений> – возвращает дерево замен
// Возвращаемое значение:
// <Булево> – Истина, если текст не содержит ошибок
Функция ПроверитьОрфографию(Текст, ДеревоЗначений = Nul l) Экспорт
Попытка
Ворд = Новый COMОбъект("Word.Application"); //Создаем объект MS Word
Исключение
Предупреждение("Microsoft Word не установлен!",,"Ошибка!");
Возврат Ложь;
КонецПопытки;
ТекстБезОшибок = Ворд.CheckSpelling(Текст); //проверяем нашу строку на ошибки
Если ТекстБезОшибок Тогда // Нет ошибок
Возврат Истина;
Иначе // Обнаружены ошибки, будем проверять по словам
Если ДеревоЗначений <> Nul l Тогда
Ворд_Активен = Ворд.Visible; //Запомним, был ли Word активен
ВремДок = Ворд.Documents.Add(); //Добавляем к открытым документам
МояОбласть = ВремДок.Range(0, 0); //Получаем пустую область в начале документа
МояОбласть.I_nsertBefore(Текст); //Добавляем в эту область нашу строку
ЧислоСлов = МояОбласть.Words.Count; //Подсчитываем число слов в области
ДеревоЗначений = Новый ДеревоЗначений; //сюда будем записывать слова и варианты их замен
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));
ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
ДеревоЗначений.Колонки.Добавить("Слово", ОписаниеТипов, "Слово/Замена",);
wdSpellword=0; //константа Word, указывающая на то, что при при вызове проверки орфографии возвращается множество замен
wdDoNotSaveChanges=0; //константа Word, указывающая на то, что при закрытии не надо сохранять изменения в закрываемом документе
Для НомерСлова = 1 По ЧислоСлов Цикл
ОбработкаПрерыванияПользователя();
ПровОбласть = МояОбласть.Words(НомерСлова); //выбираем очередное слово
ПровСлово = СокрЛП(ПровОбласть.Text);
СловоБезОшибок = Ворд.CheckSpelling(ПровСлово); //проверяем наше слово на ошибки
Если НЕ СловоБезОшибок Тогда //получаем варианты замен (их может и не быть!)
Если ДеревоЗначений.Строки.Найти(ПровСлово, "Слово") = Неопределено Тогда
НоваяСтрока = ДеревоЗначений.Строки.Добавить();
НоваяСтрока.Слово = ПровСлово;
Замены = ПровОбласть.GetSpellingSuggestions( ,1, ,wdSpellword); //проверяем орфографию, укзав, что возвращать надо множество замен
ЧислоЗамен = Замены.Count; //получаем число возможных замен
Если ЧислоЗамен > 0 Тогда //заносим варианты замен в таблицу значений
Для НомерЗамены = 1 По ЧислоЗамен Цикл
СловоЗамены = СокрЛП(Замены.Item(НомерЗамены).Name);
НоваяПодСтрока = НоваяСтрока.Строки.Добавить();
НоваяПодСтрока.Слово = СловоЗамены;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ВремДок.Close(wdDoNotSaveChanges,,);
Если Не Ворд_Активен Тогда
Ворд.Quit();
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецЕсли;
КонецФункции
Пример использования:
Код 1C v 8.х
Перем ДеревоЗначений;
Состояние("Идет проверка орфографии. Пожалуйста ждите...");
Текст = ЭлементыФормы.ПолеТекстовогоДокумента.ПолучитьТекст(); // Получаем текст
Если ПроверитьОрфографию(Текст, ДеревоЗначений) Тогда // Проверяем орфографию
Предупреждение("Текст ошибок не содержит!!!", 5, "OK");
Иначе
Если ДеревоЗначений.Строки.Количество() > 0 Тогда
// Создаем и открываем форму автозамен...
ФормаВыбора = ЭтотОбъект.ПолучитьФорму("ФормаВыбора");
Для каждого СтрокаДЗ Из ДеревоЗначений.Строки Цикл
Строка = ФормаВыбора.ДеревоЗначений.Строки.Добавить();
Строка.Слово = СтрокаДЗ.Слово;
Для каждого ПодСтрокаДЗ Из СтрокаДЗ.Строки Цикл
ПодСтрока = Строка.Строки.Добавить();
ПодСтрока.Слово = ПодСтрокаДЗ.Слово;
КонецЦикла;
КонецЦикла;
Если ФормаВыбора.ОткрытьМодально() = "OK" Тогда
// Производим автозамены в тексте
Для каждого СтрокаДЗ Из ФормаВыбора.ДеревоЗначений.Строки Цикл
Для каждого ПодСтрокаДЗ Из СтрокаДЗ.Строки Цикл
Если ПодСтрокаДЗ.Пометка Тогда
Текст = СтрЗаменить(Текст, ПодСтрокаДЗ.Родитель.Слово, ПодСтрокаДЗ.Слово);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ЭлементыФормы.ПолеТекстовогоДокумента.УстановитьТекст(Текст); //Вставим в поле исправленный текст
КонецЕсли;
Иначе
Предупреждение("В тексте найдены ошибки, но вариантов автозамены не нашлось!!!", 5, "Ошибка");
КонецЕсли;
КонецЕсли;
Категория:
Работа с Microsoft Office и OpenOffice Скрипт запуска 1С:Предприятия от имени Администратора или Пользователя Данные пример для 7.7, для 8-ых версий указать путь к 1Сv8.exe
Код VBS
Dim WshShell, ObjFSO
Set WshShell = CreateObject("WScript.Shell")
set objFSO = CreateObject("Scripting.FileSystemObject")
appl="C:\1Cv7\BINOP\1CV7s.exe"
users="DomenKompanii\emigachev"
Set objWMIService = GetObject _
("winmgmts:\\.\root\cimv2:Win32_Process")
errReturn = objWMIService.Create _
("cmd.exe /K ""title RUNAS_AUTO & runas.exe /user:" & users & " """ & appl & """""", Nul l, Nul l, intProcessID)
wscript.Sleep(1000)
wshShell.AppActivate "RUNAS_AUTO"
function WriteWord()
WshShell.SendKeys "P@ssw0rd"
end function
wscript.Sleep(1000)
wshShell.SendKeys "{ENTER}"
или так:
Код VBS
Set WshShell = CreateObject("Wscript.Shell")
Set WshEnv = WshShell.Environment("PRocess")
WshShell.Run "runas.exe /user:DomenKompanii\emigachev C:\WD\1Cv7\BINOP\1CV7s.exe"
Wscript.Sleep 800
WshShell.AppActivate WshEnv("SystemRoot") & "\system32\runas.exe"
Wscript.Sleep 200
WshShell.SendKeys "P@ssw0rd"
Wscript.Sleep 500
Категория:
Администрирование Экспорт печатных форм и любых данных из 1С в BMP, JPEG, PCX, PDF, PNG и TIFF. Оптимальным решением является установка
Bullzip PDF Printer . После установки в системе появляется виртуальный принтер, с помощью которого можно "печатать" в файл pdf из любого приложения. Программа бесплатная, работает в терминале и имеет поддержку русского языка.
После установки, можно печатать напрямую используя код:
Код 1C v 8.х
//Таб - ТабличныйДокумент
//ИмяФайла – путь для сохранения файла PDF (например «D:\Torg12.pdf»)
Процедура СоздатьФайлПДФ(Таб, ИмяФайла)
Попытка
ПДФПринтер = Новый ComObject(«Bullzip.PDFPrinterSettings»);
ПДФПринтер.SetValue(«output», ИмяФайла);
ПДФПринтер.SetValue(«ShowSaveAS», «never»);
ПДФПринтер.SetValue(«ShowProgress», «no»);
ПДФПринтер.SetValue(«ShowProgressFinished», «no»);
ПДФПринтер.SetValue(«ShowSettings», «never»);
ПДФПринтер.SetValue(«ShowPDF», «no»);
ПДФПринтер.SetValue(«ConfirmOverwrite»,»no»);
ПДФПринтер.WriteSettings();
Таб.Автомасштаб = Истина;
Таб.ИмяПринтера = «Bullzip PDF Printer»;Таб.Напечатать(Истина);
PDFФайл = Новый Файл(ИмяФайла);
Пока НЕ PDFФайл.Существует() Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
Сообщить(«Скорее всего необходимо установить или переустановить «»Bullzip PDF Printer»);
КонецПопытки;
//устанавливаем принтер по умолчанию
Таб.ИмяПринтера = ПолучитьПринтерПоУмолчанию();
КонецПроцедуры
Здесь функция
ПолучитьПринтерПоУмолчанию() нужна для того чтобы вернуть печатной форме принтер по умолчанию, т.к. если напечатать без предварительного просмотра то печать пойдет на виртуальный PDF принтер BullzipPDFPrinter.
Код 1C v 8.х //получаем принтер по умолчанию
Функция ПолучитьПринтерПоУмолчанию()
Скрипт = Новый ComObject(«MSScriptControl.ScriptControl»);
Скрипт.Language = «vbscript»;
Скрипт.AddCode(»
|Function GetDefaultPrinter()
|GetDefaultPrinter=vbNul lString
|Set objWMIService=GetObject(«»winmgmts:»" _
|& «»{impersonationLevel=impersonate}!\\.\root\cimv2″»)
|Set colInstalledPrinters=objWMIService.ExecQuery _
|(«»S_elect * from Win32_Printer»")
|For Each objPrinter in colInstalledPrinters
|If objPrinter.Attributes and 4 Then
|GetDefaultPrinter=objPrinter.Name
|Exit For
|End If
|Next
|End Function»);
Возврат СокрЛП(Скрипт.run(«GetDefaultPrinter»));
КонецФункции
Печать в PDF используя bioPDF Категория:
Администрирование Получение списка зарегистрированных на текущем компьютере баз 1С Предприятие 1Cv7 Код 1C v 7.x // Процедура получает из реестра список зарегистрированных ИБ 7.7
Процедура ПолучитьСписокИБ()
Попытка
ScrptCtrl=Новый COMObject("MSScriptControl.ScriptControl");
ScrptCtrl.Language="vbscript";
ScrptCtrl.AddCode("
|Function Get1CV77Titles()
| const HKEY_CURRENT_USER = &H80000001
| Set oReg=GetObject(""winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"")
| strKeyPath = ""Software\1C\1Cv7\7.7\Titles""
| oReg.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValues
| strInfo=vbNul lString
| Get1CV77Titles = strInfo
| On Error Resume Next
| For i = LBound(arrValues) To UBound(arrValues)
| call oReg.GetStringValue(HKEY_CURRENT_USER,strKeyPath,arrValues(i),Value)
| strInfo=strInfo & arrValues(i) & vbTab & Value & vbCrLf
| Next
| Get1CV77Titles = strInfo
|End Function
|");
Текст=СокрЛП(ScrptCtrl.Run("Get1CV77Titles"));
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ТаблицаПути.Очистить();
Если НЕ ЗначениеЗаполнено(Текст) Тогда
Возврат;
КонецЕсли;
Для Ном=1 По СтрЧислоСтрок(Текст) Цикл
СтрБазы=СтрПолучитьСтроку(Текст,Ном);
Разд=Найти(СтрБазы,Символы.Таб);
Путь=Лев(СтрБазы,Разд-1);
Название=Прав(СтрБазы,СтрДлина(СтрБазы)-Разд);
НоваяСтрока = ТаблицаПути.Добавить();
НоваяСтрока.Имя = Название;
НоваяСтрока.Путь = Путь;
КонецЦикла;
ТаблицаПути.Сортировать("Имя");
КонецПроцедуры //ПолучитьСписокИБ
Функция возвращает список значений содержащий список баз установленных на данном компьютаре. В котором в качестве значения указывается путь до базы, а в представлении название базы, так как она отображается в окне выбора баз при запуске 1С. Если баз не обнаруженно то возвращает строку "Error"
Код 1C v 7.x
функция сзПолучитьСписокБаз()
попытка
// Создаем объект Microsoft Script Control.
олеСкрипт = создатьобъект("MSScriptControl.ScriptControl");
// Устанавливаем в качестве языка для выполнения сценариев Visual Basic
олеСкрипт.Language = "VBScript";
// Формируем код на VB.
// В принципе он все делает. Создает объект
// Windows Management Instrumentation и уже через него
// получает значение ключи реестра преобразовывая данные
// в строку.
стрКод =
"function strGetListBase()
| const RootKey = &H80000001
| set Reg = GetObject(""winmgmts:{impersonationLevel=impersonate}!\\."" &_
| ""\root\default:StdRegProv"")
| PathKey = ""Software\1C\1Cv7\7.7\Titles""
| Reg.EnumValues RootKey, PathKey, Arr
| Answer = ""{""""СписокЗначений"""",{""
| for x = LBound(Arr) to UBound(Arr)
| call Reg.GetStringValue(RootKey, PathKey, Arr(x), Value)
| Answer = Answer & ""{{""""Строка"""","""""" &_
| Arr(x) & """"""},"""""" & replace(Value, """""""", """""""""""") &_
| """""",""""0""""}""
| if x <> UBound(Arr) then Answer = Answer & "",""
| next
| Answer = Answer & ""}}""
| strGetListBase = Answer
|end function";
// Добавляем наш код.
олеСкрипт.AddCode(стрКод);
// Вызываем его на выполнение, и пытаемся из полученного результата
// сформировать список значений.
Ответ = значениеизстроки(олеСкрипт.Run("strGetListBase"));
// Отсортируем список по Представлению баз
Ответ.СортироватьПоПредставлению();
исключение
// Если произошла ошибка. Значит вернем "Error".
Ответ = "Error";
конецпопытки;
возврат Ответ;
конецфункции
Еще примеры! Получение списка баз 1С 7.7 из реестра Категория:
Полезные, Универсальные Функции Функция выполняет пропорциональное распределение суммы в соответствии с заданными коэффициентами Код 1C v 8.х
// Функция выполняет пропорциональное распределение суммы в соответствии с заданными коэффициентами распределения
//
// Параметры:
// ИсхСумма - распределяемая сумма
// МассивКоэф - массив коэффициентов распределения
// Точность - точность округления при распределении. Необязателен.
//
// Возврат:
// МассивСумм - массив размерностью равный массиву коэффициентов, содержит
// суммы в соответствии с весом коэффициента (из массива коэффициентов)
// В случае если распределить не удалось (сумма = 0, кол-во коэф. = 0,
// или суммарный вес коэф. = 0), тогда возвращается значение Неопределено
//
Функция РаспределитьПропорционально(Знач ИсхСумма, МассивКоэф, Знач Точность = 2) Экспорт
Если МассивКоэф.Количество() = 0 Или ИсхСумма = 0 Или ИсхСумма = Nul l Тогда
Возврат Неопределено;
КонецЕсли;
ИндексМакс = 0;
МаксЗнач = 0;
РаспрСумма = 0;
СуммаКоэф = 0;
Для К = 0 По МассивКоэф.Количество() - 1 Цикл
МодульЧисла = ?(МассивКоэф[К] > 0, МассивКоэф[К], - МассивКоэф[К]);
Если МаксЗнач < МодульЧисла Тогда
МаксЗнач = МодульЧисла;
ИндексМакс = К;
КонецЕсли;
СуммаКоэф = СуммаКоэф + МассивКоэф[К];
КонецЦикла;
Если СуммаКоэф = 0 Тогда
Возврат Неопределено;
КонецЕсли;
МассивСумм = Новый Массив(МассивКоэф.Количество());
Для К = 0 По МассивКоэф.Количество() - 1 Цикл
МассивСумм[К] = Окр(ИсхСумма * МассивКоэф[К] / СуммаКоэф, Точность, 1);
РаспрСумма = РаспрСумма + МассивСумм[К];
КонецЦикла;
// Погрешности округления отнесем на коэффиецент с максимальным весом
Если Не РаспрСумма = ИсхСумма Тогда
МассивСумм[ИндексМакс] = МассивСумм[ИндексМакс] + ИсхСумма - РаспрСумма;
КонецЕсли;
Возврат МассивСумм;
КонецФункции
Категория:
Работа с Числами