Поместится ли текст в ячейке? (с примерами использования: авторазмер шрифта, перенос строк)

Публикация № 123769

Разработка - Практика программирования

Периодически возникает вопрос: поместится ли текст в ячейке табличного документа? Хоть возникает он редко, но всё-таки возникает. В этой статье рассказывается как можно получить ответ на этот вопрос.

 

Вступление:

На просторах интернета я встречал различные решения, но все они носили "вероятностный" характер и строились на определении среднего размера символа (или максимального размера), вычислением длины строки, количеством строк, используя всяческие эмпирические коэффициенты, и всё равно не могли гарантировать, что текст поместится в ячейку.

Единственное решение, близкое к задаче, которое я нашел: Автоматический подбор размера шрифта в объекте РисунокТабличногоДокумента. Но оно для размещения текста в РисунокТабличногоДокумента, а не в область как в данной статье. Оно требует предварительной подготовки, но ничего проще именно для РисункаТабличногоДокумента на данный момент мне неизвестно (попытку упрощения см ниже).

Дальнейший поиск в интернете подтвердил существование как самой проблемы, так и наличие сложностей с её решением. Стоит признать, обсуждения сводились, как это часто бывает, к тому, что автор вопроса просит о никому не нужном функционале. И вообще, автор такого вопроса в ходе осуждения приобретал статус борца с ветрянными мельницами.

Сам я эту проблему зачастую обходил теми или иными путями. И это всех удовлетворяло: и меня, и заказчиков. Видимо, из-за того, что встречается она редко:

1. В ценниках. Наименование товара обычно центрируют по высоте, и при очень длинном наименовании его начало и конец имеют риск не поместиться в отведенное ему место (а в ценниках обычно отключают автовысоту). Из этого положения два выхода:

а) Выбирать тот или иной шаблон ценника. Не реализовано в примерах.

б) Подгонять размер текста под ценник. Реализовано в примерах:

Авторазмер текста

 2. И когда наименование нужно написать на несколько строк:

В типовых это реализовано так:

Типовое решение вывода длинного текста

мне же больше по душе выводить его так (с автоматическим переносом слов):

человеческое написание

Решение:

Намучавшись за два вечера, пришел, надеюсь, к простому решению:

Идея такая:

1. Запоминаем исходный размер ячейки в мм.

2. Назначаем ячейке свойство АвтоВыстота = Истина

3. Вставляем текст и опять смотрим высоту ячейки.

4. Если высота ячейки изменилась в большую сторону - значит, текст не помещается.

Высоту ячейки в мм будем измерять с помощью вставки в ячейку Рисунка и измерением его размеров.

Подробно:

Функция получения высоты ячейки:

Функция ВысотаОбластиВмм(пОбласть, пТабДок)
    
    Надпись = пТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);    
    Надпись.Расположить(пОбласть);    
    Высота = Надпись.Высота;    
    пТабДок.Рисунки.Удалить(Надпись);
    
    Возврат(Высота);
    
КонецФункции

Функция для определения вместится ли текст в ячейку:

Функция ТекстУмещаетсяВЯчейке(пОбласть, пТабДок, пТекст)     
        
    ВысотаДо = ВысотаОбластиВмм(пОбласть, пТабДок);    
    
    // Скопируем область в новый табличный документ.
    //  И там уже будем играть с её свойствами.
    ВремТабДок = Новый ТабличныйДокумент;
    ВремТабДок.Вывести(пТабДок);
    ВремОбласть = ВремТабДок.Область(пОбласть.Имя);    
    
    ВремОбласть.АвтоВысотаСтроки = Истина;
    ВремОбласть.ВысотаСтроки     = 0;    
    
    ВремОбласть.Текст = пТекст;        
    ВысотаПосле = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);
                
    Если ВысотаДо >= ВысотаПосле Тогда
        Возврат(Истина);
    Иначе
        Возврат(Ложь);
    КонецЕсли;

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

Для возможности использования этого метода необходимо соблюдать следующие условия:

1. Необходимо как-нибудь назвать область.

2. Заполнение области = Текст, а не Параметр или Шаблон. В принципе, можно использовать и то и другое, но код становиться мудрёней. Во всяком случае, я ничего простого не придумал. И так как жизнь это усложняет не сильно не стал заморачиваться из-за этого.

3. Размещение текста = Перенос. Вот это нужно обязательно! Размещение текста програмно поставить можно, но эффект от изменения, насколько я понял, появляется только после отображения табличного документа с этой ячейкой.

4. Область из одной строки. Т.е. объединять ячейки по вертикали нельзя (в тех которых должен проверяться текст). Исправлено в процессе публикации: создается копия табличного документа с областью и уже меняются её свойства, а не самого табличного документа.


 

В файлах вы найдете:

1. Пример с подбором размера шрифта с использованием функций из статьи.

2. Оптимизированный по быстродействию пример подбора размера шрифта с небольшой модификацией кода (но подбор размера шрифта - не оптимальный. Ниже есть некая попытка его вычилить а не уменьшать каждый раз на 1).

3. Вывод длинных строк в несколько ячеек.

4. Подбор размера шрифта в элементе "Рисунок табличного документа".


Рисунок табличного документа (Надпись):

Скажу сразу, на больших текстах, работает ужасно долго.

Так вот, с рисунком табличного документа (далее "надписью") пришлось повозиться. Всё дело в том, что при установленом свойстве "Авторазмер" сами размеры подгоняются под текст только после их отображения. Здесь вариантов два:

1. либо ждать какое время и затем смотреть размеры, например так: ПодключитьОбработчикОжидания("ИзмеритьРазмеры", 0.1, Истина)

2. либо "заставить" эту заразу отображаться принудительно.

Первый - рабочий. Однако код с ним получается сложный. И на каждую иттерацию - минимум по 0.1 секунды. В итоге это очень долго. Но работает (вроверял на поле таблчного документа).

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

Думал, я думал. А точнее, экперементировал, я экспериментировал. И вот до чего дошел:

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

Код приводить в человеческий вид мне лень. Если что, то есть файл в примерах.

Хочу отметить пару интересных моментов:

1. Вычисление высоты надписи при её фиксированной ширине.

2. Попытка оптимизировать алгоритм поиска шрифта.


// ;сообщить(...) - отладка

Функция ВысотаНадписиПриФиксированнойШирине(пНадпись, пЭлТабДок, пТекст)
        
    СтруктураНачЗначений = Новый Структура("Ширина, Высота, Авторазмер, РазмещениеТекста");
    ЗаполнитьЗначенияСвойств(СтруктураНачЗначений, пНадпись);     
    
    //////////////////////////////////////////////////////////////////////////////
    
    НачШирина = пНадпись.Ширина;
    
    пНадпись.Авторазмер = Истина;
    пНадпись.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Обрезать;
        
    ТекТекст = "";
    ВсегоСимволов = СтрДлина(Текст);
    
    ИндексДлиныСтроки = 0;
    
    Для Индекс = 1 По ВсегоСимволов Цикл
        
        ИндексДлиныСтроки = ИндексДлиныСтроки + 1;        
        
        ТекСимвол = Сред(пТекст, Индекс, 1);        
        пНадпись.Текст = ТекТекст + ТекСимвол;
        
        пЭлТабДок.Показать();
        
        Если пНадпись.Ширина > НачШирина Тогда
            
            Если ИндексДлиныСтроки = 1 Тогда // не вместился единственный символ.
                Возврат(Неопределено);
            КонецЕсли;
            
            ТекТекст = ТекТекст + Символы.ПС;            
            Индекс = Индекс - 1; // да, да, я и сам не люблю такие манипуляции со счетчиком цикла, но исправлять лень.
            ИндексДлиныСтроки = 0;
            
        Иначе
            ТекТекст = ТекТекст + ТекСимвол;
        КонецЕсли;
        
    КонецЦикла;
    
    пНадпись.Текст = ТекТекст;
    пЭлТабДок.Показать();
    
    ИтоговаяВысота = пНадпись.Высота;
    
    //////////////////////////////////////////////////////////////////////////////
    
    ЗаполнитьЗначенияСвойств(пНадпись, СтруктураНачЗначений);
    
    Возврат(ИтоговаяВысота);
    
КонецФункции

Функция ПолучитьОптимальныйРазмерШрифта(пМакет, пИмяНадписи, пТекст, пМаксимальныйРазмерШрифта ,пТабДок)
    
    пТабДок.Вывести(пМакет);
    
    Надпись = пТабДок.Рисунки[пИмяНадписи];
    
    //////////////////////////////////////////////////////////////////////////
    // { Подгон размера шрифта
    
    НачВысота = Надпись.Высота;    
    
    РазмерШрифта = пМаксимальныйРазмерШрифта;
    
    Надпись.Шрифт = Новый Шрифт(Надпись.Шрифт, ,РазмерШрифта);
    ТекВысота = ВысотаНадписиПриФиксированнойШирине(Надпись, пТабДок, пТекст);
    
    Если ТекВысота = Неопределено Тогда
        Возврат(Неопределено);
    КонецЕсли;
    
    Пока НачВысота < ТекВысота
        И РазмерШрифта > 0 Цикл
        
        ;Сообщить("РазмерШрифта = "+РазмерШрифта);
                
        НовРазмерШрифта = Цел(РазмерШрифта / (Sqrt(ТекВысота / НачВысота)));        
        
        ;Сообщить("НовРазмерШрифта = "+НовРазмерШрифта);
        
        Если НовРазмерШрифта = РазмерШрифта Тогда НовРазмерШрифта = НовРазмерШрифта - 1 КонецЕсли;
        
        РазмерШрифта = НовРазмерШрифта;
        Надпись.Шрифт = Новый Шрифт(Надпись.Шрифт, ,РазмерШрифта);
        ТекВысота = ВысотаНадписиПриФиксированнойШирине(Надпись, пТабДок, пТекст);
        
    КонецЦикла;
    
    // Точная подгонка (в сторону увеличения)
    
    ИтоговыйРазмерШрифта = РазмерШрифта;
    
    Пока ТекВысота <> Неопределено
        И НачВысота > ТекВысота
        И РазмерШрифта < пМаксимальныйРазмерШрифта Цикл
        
        ИтоговыйРазмерШрифта = РазмерШрифта;
        
        ;Сообщить("РазмерШрифта = "+РазмерШрифта);
                
        НовРазмерШрифта = РазмерШрифта + 1;        
        
        ;Сообщить("НовРазмерШрифта = "+НовРазмерШрифта);
        
        РазмерШрифта = НовРазмерШрифта;
        Надпись.Шрифт = Новый Шрифт(Надпись.Шрифт, ,РазмерШрифта);
        ТекВысота = ВысотаНадписиПриФиксированнойШирине(Надпись, пТабДок, Текст);

    КонецЦикла;    
    
    // }
    ////////////////////////////////////////////////////////////////////

    //Если ТекВысота = Неопределено Тогда
    //    ИтоговыйРазмерШрифта = Неопределено;    
    //КонецЕсли;
    
    Возврат(ИтоговыйРазмерШрифта);    
    
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Макет = ПолучитьМакет("Макет");
    
    ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;    
    ТабДок.Очистить(); // Мы же хотим посмотреть в удобном месте?    
    
    РазмерШрифта = ПолучитьОптимальныйРазмерШрифта(Макет, "Надпись", Текст, 80 ,ТабДок);    
    
    Если РазмерШрифта <> Неопределено Тогда
        
        Надпись = Макет.Рисунки.Надпись;
        Надпись.Шрифт = Новый Шрифт(Надпись.Шрифт, ,РазмерШрифта);        
        Надпись.Текст = Текст;        
        Макет.Показать();
        
    Иначе
        
        Предупреждение("Ошибка подбора размера (даже единственный символ не поместился)!");
        
    КонецЕсли;     
    
КонецПроцедуры
 

Удачных экспериментов!

Скачать файлы

Наименование Файл Версия Размер
Печать ценников публикация подбор размера шрифта (Оптимизирован)
.epf 12,32Kb
19.04.12
101
.epf 12,32Kb 101 Скачать
Наименование в несколько строк публикация
.epf 8,87Kb
05.04.12
67
.epf 8,87Kb 67 Скачать
Печать ценников публикация подбор размера шрифта
.epf 12,28Kb
19.04.12
36
.epf 12,28Kb 36 Скачать
Подбор размера шрифта в надписи табличного документа
.epf 8,82Kb
19.04.12
29
.epf 8,82Kb 29 Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. i132 115 06.04.12 10:36 Сейчас в теме
Спасибо, за находку, +10$m
предлагаю поменять название на "подгонка размера шрифта под размеры ячейки". - смысл статьи как обходить случаи кода весь текст не помещается в ячейке.
5. yku 331 06.04.12 13:51 Сейчас в теме
(1) Признаться честно, над названием статьи я, наверное, даже больше просидел, чем над самой статьей. Но с предложенным названием не согласен: статья у меня как раз не как обходить такие случаи, а как их выявить программно. С этим возникает сложность. А вот что делать при таких случаях - это уже у кого на что фантазии хватит.
6. yku 331 06.04.12 14:00 Сейчас в теме
(1) и спасибо за 10$m. Я и не знал что их можно перекидывать. Правда, я не знаю что с ними надо делать :)
16. prog-eg 70 19.04.12 12:45 Сейчас в теме
(6) за 10$m можно поднять публикацию
2. Поручик 4347 06.04.12 10:40 Сейчас в теме
Кстати, да, задача редкая, но не тривиальная.
В прошлом году было подобное, но использовал другую методику, основанную на подгонке строки в ячейке и вычислении получившегося количества символов.

Неделю мозг ломал, пока не наткнулся
http://avb1c.narod.ru/rowheight.html

Но получилось достаточно корректно, по крайней мере для того набора строк высота строки вычислялась верно.
mark_oilbass; salexdv; +2 Ответить
4. yku 331 06.04.12 13:41 Сейчас в теме
(2) Да, по ссылке тоже интересное решение. Я б не додумался.
7. mikhailv 09.04.12 15:26 Сейчас в теме
Автору огромное спасибо за качественную и достаточно универсальную реализацию недостающей в 1С функции.
(2) Поручик, эта реализация мне понравилась больше, чем указанная вами.

Пригодилось в печати спецификации на "разлинованной" таблице.

Пока внедрял, наткнулся на то, что 1С (рел. 8.2.13.219) при крайних значениях заполнения в ячейке (когда текст чуть-чуть не умещается и переносится на другую строку) не правильно отрабатывает высоту (через картинку). При отладке видно, что текст ПЕРЕНЁССЯ, а высота картинки возвращается такой же, как и без переноса.
Решил проблему дополнительной проверкой с добавлением одного символа:

//Функция для определения вместится ли текст в ячейку:
Функция ТекстУмещаетсяВЯчейке(пОбласть, пТабДок, пТекст)

ВысотаДо = ВысотаОбластиВмм(пОбласть, пТабДок);

// Скопируем область в новый табличный документ.
// И там уже будем играть с её свойствами.
ВремТабДок = Новый ТабличныйДокумент;
ВремТабДок.Вывести(пТабДок);
ВремОбласть = ВремТабДок.Область(пОбласть.Имя);

ВремОбласть.АвтоВысотаСтроки = Истина;
ВремОбласть.ВысотаСтроки = 0;

ВремОбласть.Текст = пТекст;
ВысотаПосле = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);

Если ВысотаДо >= ВысотаПосле Тогда
//Попробуем отловить умещение "на грани": добавим символ
ВремОбласть.Текст = пТекст + "Щ";
ВысотаПослеСимв = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);
Если ВысотаДо >= ВысотаПослеСимв Тогда
Возврат(Истина);
Иначе
Возврат(Ложь);
КонецЕсли;

Иначе
Возврат(Ложь);
КонецЕсли;

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

Также на базе этой функции написал ПолучитьМассивУмещающихсяСтрок(пОбласть, пТабДок, пТекст), в которой текст разбивается на несколько умещающихся в указанную ячейку строк.
8. Поручик 4347 09.04.12 15:34 Сейчас в теме
(7) Я её и сам бы не стал использовать, если бы тогда появилась эта статья. Но времени на эксперименты особо не было.
9. yku 331 09.04.12 17:08 Сейчас в теме
(7) Пожалуйста. Надо будет подправить публикацию. А почему бы букву не добавить сразу, а не во второй итерации?
Вот так:

//Функция для определения вместится ли текст в ячейку:
Функция ТекстУмещаетсяВЯчейке(пОбласть, пТабДок, пТекст)

ВысотаДо = ВысотаОбластиВмм(пОбласть, пТабДок);

// Скопируем область в новый табличный документ.
// И там уже будем играть с её свойствами.
ВремТабДок = Новый ТабличныйДокумент;
ВремТабДок.Вывести(пТабДок);
ВремОбласть = ВремТабДок.Область(пОбласть.Имя);

ВремОбласть.АвтоВысотаСтроки = Истина;
ВремОбласть.ВысотаСтроки = 0;

//ВремОбласть.Текст = пТекст;
ВремОбласть.Текст = пТекст+"Щ"; // Для исключения ситуаций вида "на грани переноса"
ВысотаПосле = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);

Если ВысотаДо >= ВысотаПосле Тогда
Возврат(Истина);
Иначе
Возврат(Ложь);
КонецЕсли;

КонецФункции
10. mikhailv 09.04.12 17:15 Сейчас в теме
(9) Согласен, ваш вариант лучше:)
3. Поручик 4347 06.04.12 10:42 Сейчас в теме
11. Ortos 10.04.12 10:14 Сейчас в теме
Хороший метод, для ячейки табличного документа самое оно!
12. krylovim 18.04.12 19:29 Сейчас в теме
Хороший метод, спасибо автору!

Только есть одно узкое место - производительность:
у меня в печатной форме выводилось 9 строк с обязательным переносом, в случае не помещения текста в ячейку. Все это дело формировалось ~9 секунд - на мой взгляд слишком долго для небольшой печатной формы.
Замер производительности показал, что самым узким местом оказался вывод исходного табличного документа (пТабДок) во временный (ВремТабДок).
Вместо работы во временном табличном документе я предпочел сохранение/восстановление изменяемых свойств (АвтоВысотаСтроки, ВысотаСтроки и Текст) и работу оставил в исходном таб. документе.
Результат - 0,35 сек, т.е. практически в 30 раз быстрее.
13. yku 331 18.04.12 23:56 Сейчас в теме
(12) lonelylockly,
Спасибо за замечания. Да, я тоже заметил, что так медленней, но на моих задач замедление не было критичным и не выходило за рамки пары секунд.

Кстати, сначала я тоже непосредственно менял в самой области. Но заметил, что если "тестируемая" область содержит объединенную ячейку в несколько строк, то высота не восстанавливается. А как сделать чтобы она восстанавливалась, я не знаю. И я решил пожертвовать быстродействием и выиграть в универсальности.

PS. И если бы скачали вротой файл ("Наименование в несколько строк публикация"), то там как раз такой способ (менять его мне было лень):
Функция ТекстУмещаетсяВЯчейке(пОбласть, пТабДок, пТекст) 	
		
	// Сохраним настройки области
	СтруктураЗначений = Новый Структура("Текст, АвтовысотаСтроки, ВысотаСтроки");	
	ЗаполнитьЗначенияСвойств(СтруктураЗначений, пОбласть);
	
	////////////////////////////////////////////////////////////­//////////////////
		
	пОбласть.Текст = "";		
	ВысотаДо = ВысотаОбластиВмм(пОбласть, пТабДок);	
					
	пОбласть.АвтоВысотаСтроки = Истина;
	пОбласть.ВысотаСтроки     = 0;	
	
	пОбласть.Текст = пТекст;		
	ВысотаПосле = ВысотаОбластиВмм(пОбласть, пТабДок);
	    		
	////////////////////////////////////////////////////////////­//////////////////	
	
	// Восстановим настройки области
	ЗаполнитьЗначенияСвойств(побласть, СтруктураЗначений);
	
	Если ВысотаДо >= ВысотаПосле Тогда
		Возврат(Истина);
	Иначе
		Возврат(Ложь);
	КонецЕсли;

КонецФункции
Показать
14. yku 331 19.04.12 00:01 Сейчас в теме
(12) Протестировал как со старым методом, так и с новым. В лидерах по медлительности "Высота = Надпись.Высота;". А вот сразу за ним как раз "ВремТабДок.Вывести(пТабДок);". Чуть-чуть отстает.
19. krylovim 25.04.12 22:40 Сейчас в теме
(14) у меня такой разрыв скорее всего (~99%) связан с тем, что в области, которая копировалась во временный таб. док. находился рисунок(картинка). Не проверял, но практически уверен в этом. Так что грамотная организация именованных областей и формирование табличного документа окажутся гораздо более простым решением =)
15. yku 331 19.04.12 00:04 Сейчас в теме
(12) Вот так флуд я устроил. Вот метод и быстро выполняющийся и поддерживающий возможность объединения ячеек (копия табличного документа создается вне цикла):
Функция ВысотаОбластиВмм(пОбласть, пТабДок)
	
	Надпись = пТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);	
	Надпись.Расположить(пОбласть);	
	Высота = Надпись.Высота;    
	пТабДок.Рисунки.Удалить(Надпись);
	
	Возврат(Высота);
	
КонецФункции

Процедура ВывестиТекстВОбласть(пОбласть, пТабДок, пТекст, пМаксимальныйРазмерТекста = 60)
	
	// Запомним высоту исходной ячейки.
	НачальнаяВысота = ВысотаОбластиВмм(пОбласть, пТабДок);	
	
	// Создадим копию области и изменим её свойства.
	
	ВремТабДок = Новый ТабличныйДокумент;
	ВремТабДок.Вывести(пТабДок);
	ВремОбласть = ВремТабДок.Область(пОбласть.Имя);	
	
	ВремОбласть.АвтоВысотаСтроки = Истина;
	ВремОбласть.ВысотаСтроки     = 0;
	
	ВремОбласть.Текст = пТекст + "Щ"; // +"Щ" - исключение ситуации "на грани переноса"
	
	// Подберем зармер шрифта
	
	РазмерТекста = пМаксимальныйРазмерТекста;
	ВремОбласть.Шрифт = Новый Шрифт(ВремОбласть.Шрифт, ,РазмерТекста);
	
	ТекВысота = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);
	
	Пока ТекВысота > НачальнаяВысота И РазмерТекста > 0 Цикл
			
		РазмерТекста = РазмерТекста - 1;
		ВремОбласть.Шрифт = Новый Шрифт(ВремОбласть.Шрифт, ,РазмерТекста);
		ТекВысота = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);
		
	КонецЦикла;		
	
	// Изменим размер шрифта исходной области и выведем текст.
	
	пОбласть.Шрифт = Новый Шрифт(пОбласть.Шрифт, ,РазмерТекста);
	пОбласть.Текст = пТекст;
	
КонецПроцедуры
Показать
17. Ortos 25.04.12 08:57 Сейчас в теме
Второй метод с элементом "Рисунок" подходит для любого шрифта, это плюс. Однако он дико медленный. Пробовал я тоже так делать сперва, отверг такой метод - для большого количества рисунков в которых много текста не подходит абсолютно.
18. yku 331 25.04.12 11:52 Сейчас в теме
(17) Ortos,
Попробовал на длинной строке... Можно состариться пока посчитает. Надо бы объединить два метода. Чтобы сначала анализировал длину строки, потом выбирал алгоритм поиска. Если строка длинная, то берет твой метод (надеюсь, можно на "ты").

Только хочу модифицировать. Для каждого символа чтобы определял высоту и ширину этого символа и высоту строк. Затем высчитывал уже необходимый размер шрифта. Или не для каждого символа, а как у тебя, для буквы "Щ".

А может, и полностью перейти на второй алгоритм. Вот только с работой завал.
20. i132 115 27.04.12 15:00 Сейчас в теме
По моим замерам в вашей обрабтке около 15 процентов уходит на создание/удаление временых ячеек и рисунков.
Если хранить ссылоку на временную ячейку -- ее размеры меняются при изменнии текста и шрифта.
Мой код:
ВремТабДок = Новый ТабличныйДокумент;
ВремТабДок.Вывести(ОбластьМакета);
ВремОбласть = ВремТабДок.Область("Комментарий");	
ВремОбласть.АвтоВысотаСтроки = Истина;
ИсходныйШрифт = ВремОбласть.Шрифт;

ПроверямНадпись = ВремТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);	
ПроверямНадпись.Расположить(ВремОбласть);	

МаксВысота = ПроверямНадпись.Высота;
Пока Выборка.Следующий() Цикл
	ПараметрыМакета.Комментарий		= Выборка.Описание;
	ТабДокумент.Вывести(ОбластьМакета);
	
	флНадоменитьШрифт =ложь;
	ВремОбласть.ВысотаСтроки =0;
	ВремОбласть.тЕКСТ = Выборка.Описание;
	
	ВремОбласть.Шрифт = ИсходныйШрифт;
	Пока ПроверямНадпись.Высота>МаксВысота Цикл
		флНадоменитьШрифт =Истина;
		ВремОбласть.Шрифт = Новый Шрифт(ВремОбласть.Шрифт,,ВремОбласть.Шрифт.Размер-1);
		Если ВремОбласть.Шрифт.Размер=1 Тогда
			Прервать;
		Конецесли;	
	КонецЦикла;
	Если флНадоменитьШрифт Тогда
		ПравимОбласть = ТабДокумент.Область("Комментарий");
		ПравимОбласть.Шрифт = ВремОбласть.Шрифт;
	КонецЕсли;	
КонецЦикла;
Показать

Работает в том числе и для ячеек заполняемых по параметру. Правда для случая объединных ячеек не проверял.
Первоначальные размеры шрифта, по моему лучше брать из исходной ячейки.
kimskiysanya; yku; kobets-meloman; +3 Ответить
21. yku 331 27.04.12 16:32 Сейчас в теме
(20) i132, Интересно. Действительно так быстрее. А можно еще и шрифт не подбирать, а после первого прогона его рассчитать
НовРазмерШрифта = Цел(РазмерШрифта / (Sqrt(ТекВысота / НачВысота)));

Так рассчитывается, но не очень точно, может ошибиться на 1-3 кегля.
Т.е. в первом проходе его рассчитали, а потом уже перебором можно уточнить.

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

Но за алгоритм спасибо.
22. kobets-meloman 15.08.12 05:40 Сейчас в теме
(20)Что у Вас за область "Комментарий"? Это на макете та самая область, шрифт которой изменяется??? Возможно вместо названия области задать ее диапазон вида что-то вроде "R2C2:R2C7" ?
23. i132 115 15.08.12 11:41 Сейчас в теме
(22) kobets-meloman, да "Комментарий" это область на мекете размер шрифта которой можно менять, задать адрес в стиле "R2C2:R2C7" можно - но тогда надо следить за адресами при следующих доработках макета - проще сразу дать название области.
24. kobets-meloman 20.08.12 05:33 Сейчас в теме
(20) Еще такой вопрос. Кусок кода не приводит к зацикливанию? В этом цикле мне непонятно, где меняется "ПроверямНадпись.Высота"... Хотя нет, по логике зацикливания не будет. Цикл завершится, когда размер шрифта станет равным 1. А все-таки хочется, чтобы цикл завершался при условии "ПроверямНадпись.Высота>МаксВысота"
Пока ПроверямНадпись.Высота>МаксВысота Цикл
      флНадоменитьШрифт =Истина;
      ВремОбласть.Шрифт = Новый Шрифт(ВремОбласть.Шрифт,,ВремОбласть.Шрифт.Размер-1);
      Если ВремОбласть.Шрифт.Размер=1 Тогда
         Прервать;
      Конецесли;   
   КонецЦикла;


Извиняюсь за, наверное, глупый вопрос. Просто реально непонятно...
25. yku 331 20.08.12 10:14 Сейчас в теме
(24) kobets-meloman,
Еще такой вопрос. Кусок кода не приводит к зацикливанию?

Нет.
В этом цикле мне непонятно, где меняется "ПроверямНадпись.Высота"...

Она напрямую не меняется.
Область ограничена по ширине. В эту область вставлен текст. Нас интересует вариант когда текст из-за ограничений ширины выводится в несколько строк. Чем больше шрифт, тем больше строк. Меняем размер шрифта - 1С меняет размер области (подгоняет под текст), а мы смотрим её высоту. Как только высота области стала меньше, чем МаксВысота, размер шрифта стал максимальным, при котором текст вмещается в нашу область. Он то нам и нужен.

Хотя нет, по логике зацикливания не будет. Цикл завершится, когда размер шрифта станет равным 1. А все-таки хочется, чтобы цикл завершался при условии "ПроверямНадпись.Высота>МаксВысота"

Всем нам хочется того же. Что мы и получаем, разве нет? "Размер шрифта >= 1" - ограничение. Так как меньшие размеры шрифта в нашей задаче не интересены.

PS. Немного смущают такие вопросы.
36. Makushimo 154 10.12.14 13:21 Сейчас в теме
(20) i132,
вот тут

ВремОбласть.Текст = пТекст


ругается "поле недоступно для записи"

в ВремТабДок и ВремОбласть свойство Защита = ложь;
26. ZhokhovM 06.11.12 16:01 Сейчас в теме
Добрый день! Кто-нибудь проверял на управляемой форме? У меня почему текст полностью переносит на следующую строку вместо текущей...
27. SinglCOOLer 210 16.12.12 12:15 Сейчас в теме
на 1С:Предприятие 8.1 (8.1.15.14) отказывается работать, в этом месте Высота = Надпись.Высота всегда возвращается одна и та же высота :(
28. yku 331 16.12.12 13:13 Сейчас в теме
(27) SinglCOOLer,
Странно, в теории поведение должно быть одинаковое. Быть может, некорректно перенесли в 8.1? А так, для меня 8.1 утратила актуальность.
29. SinglCOOLer 210 16.12.12 13:16 Сейчас в теме
проверял этот же код (обработку сконвертил под 8.2) на 8.2 все срабатывает
30. galinka1c8 16.05.13 15:02 Сейчас в теме
Автору большое спасибо, как раз пригодилось, задача хоть и редкая, но довольно занятная.
31. echo77 1103 09.09.13 08:47 Сейчас в теме
Функция ТекстУмещаетсяВЯчейке() иногда тупит и упорно говорит что текст не умещается в ячейке, я подправил её следующим образом:

Функция ТекстУмещаетсяВЯчейке(пОбласть, пТабДок, пТекст)

// Скопируем область в новый табличный документ.
// И там уже будем играть с её свойствами.
ВремТабДок = Новый ТабличныйДокумент;
ВремТабДок.Вывести(пТабДок);
ВремОбласть = ВремТабДок.Область(пОбласть.Имя);

ВысотаДо = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);

ВремОбласть.АвтоВысотаСтроки = Истина;
ВремОбласть.ВысотаСтроки = 0;

ВремОбласть.Текст = пТекст;
ВысотаПосле = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);

Если ВысотаДо >= ВысотаПосле Тогда
Возврат(Истина);
Иначе
Возврат(Ложь);
КонецЕсли;

КонецФункции
32. via 89 16.09.13 14:22 Сейчас в теме
переделал в однопроцедурный вариант

Процедура ПоигратьсяСоШрифтамиОбласти(ТабДокумент,ИмяОбласти,знач МинимальныйШрифт=5,знач МаксимальныйШрифт=80) Экспорт
	ВремТабДокумент = Новый ТабличныйДокумент;
	ВремТабДокумент.Вывести(ТабДокумент.ПолучитьОбласть(ИмяОбласти)); 
	ВремОбласть = ВремТабДокумент.Область(ИмяОбласти);
	Надпись = ВремТабДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);    
	Надпись.Расположить(ВремОбласть);    
	МинимальныйШрифт = Мин(МинимальныйШрифт,ВремОбласть.Шрифт.Размер);
	МаксимальныйШрифт = Макс(МаксимальныйШрифт,ВремОбласть.Шрифт.Размер);
	ВысотаИсходная = Надпись.Высота;
	ВремОбласть.АвтоВысотаСтроки = Истина;
	ВремОбласть.ВысотаСтроки = 0;
	Высота = Надпись.Высота;
	Если ВысотаИсходная < Высота Тогда // Попробуем уменьшить
		Пока 1=1 Цикл
			Если Высота <= ВысотаИсходная Тогда
				ТабДокумент.Область(ИмяОбласти).Шрифт = Новый Шрифт(ВремОбласть.Шрифт,,ВремОбласть.Шрифт.Размер);
				Возврат;
			КонецЕсли; 
			Если ВремОбласть.Шрифт.Размер <= МинимальныйШрифт Тогда
				ТабДокумент.Область(ИмяОбласти).Шрифт = Новый Шрифт(ВремОбласть.Шрифт,,МинимальныйШрифт);
				Возврат;
			КонецЕсли; 
			ВремОбласть.Шрифт = Новый Шрифт(ВремОбласть.Шрифт,,ВремОбласть.Шрифт.Размер-1);
			Высота = Надпись.Высота;
		КонецЦикла; 
	ИначеЕсли Высота < ВысотаИсходная Тогда // Попробуем увеличить
		Пока 1=1 Цикл
			Если ВысотаИсходная < Высота Тогда
				ТабДокумент.Область(ИмяОбласти).Шрифт = Новый Шрифт(ВремОбласть.Шрифт,,ВремОбласть.Шрифт.Размер-1);
				Возврат;
			КонецЕсли;
			Если МаксимальныйШрифт <= ВремОбласть.Шрифт.Размер Тогда
				ТабДокумент.Область(ИмяОбласти).Шрифт = Новый Шрифт(ВремОбласть.Шрифт,,МаксимальныйШрифт);
				Возврат;
			КонецЕсли; 
			ВремОбласть.Шрифт = Новый Шрифт(ВремОбласть.Шрифт,,ВремОбласть.Шрифт.Размер+1);
			Высота = Надпись.Высота;
		КонецЦикла; 
	КонецЕсли; 
КонецПроцедуры

Показать
Разумов; user757518; mark_oilbass; BigB; yku; shumvlesu; supermax2000; +7 Ответить
33. fokas 29.10.13 18:22 Сейчас в теме
Не обязательно использовать элемент формы или .Показать() для изменения высоты ячейки под текст. Обнаружил, что переприсваивание например ширины любой из ячеек табличного документа действует так же. Т.е.:
ТабДок = Новый ТабличныйДокумент;
...
ТабДок.Область(1,1,1,1).ШиринаКолонки = ТабДок.Область(1,1,1,1).ШиринаКолонки; // вместо ТабДок.Показать()
mark_oilbass; json; yku; +3 Ответить
34. yku 331 29.10.13 20:43 Сейчас в теме
35. Светлый ум 238 21.03.14 12:32 Сейчас в теме
Мои пять копеек:

"Высота строки ТабДок - Программно"

ОбластьЯчейки = Макет.ПолучитьОбласть("ШиринаСтроки|Строка");
пНадпись  = ОбластьЯчейки.ТекущаяОбласть;
НачШирина = пНадпись.ШиринаКолонки;
Стр = СтрДлина(ВыборкаСтрок.Номенклатура);


КоэффициентВысотыСтроки      = Цел(Стр/НачШирина) + 1; 
ВысотаОднойСтрокиПоУмолчанию = Число("12,5");
РасчетнаяВысотаСтроки        = ВысотаОднойСтрокиПоУмолчанию * КоэффициентВысотыСтроки;
ТекущаяВысотаСтроки          = ОбластьМакета.ТекущаяОбласть.ВысотаСтроки;
Показать

37. nghtmn_cmth 7 01.02.16 11:54 Сейчас в теме
Кто не хочет сильно заморачиваться:
1. Определяете сколько символов может войти в строку без переноса

СтрокаС = СтрЗаменить(СтрокаС,Символы.ПС, " ");
	Длинна =  СтрДлина(СтрокаС);
	КолСтрок =Окр( Длинна/Максимальное число символов+0.5,0,0);
	Позиция = 1;
	Для а=1 по КолСтрок Цикл
		ПодСтр = Сред(СтрокаС,Позиция,Максимальное число символов);
		Позиция= Позиция+Максимальное число символов;
		Сообщить(ПодСтр);
	КонецЦикла;
Показать
38. yku 331 01.02.16 15:29 Сейчас в теме
(37) nghtmn_cmth,
Проблема в том, что вот 10 символов "i"
iiiiiiiiii
а вот 10 символов "W"
WWWWWWWWWW
разница существенная.

А тем, кто не хочет "сильно заморачиваться", скорее всего эта статья вообще не нужна :)
39. nghtmn_cmth 7 02.02.16 10:07 Сейчас в теме
(38) определяем сколько самых широких символов входит в строку и переносим, останется конечно часть строки пустой, но ведь мы не заморачиваемся
40. CheBurator 3404 02.02.16 22:09 Сейчас в теме
я решил достаточно просто - для печати ценников подходит идеально, не зависит от размеров типов шрифтов.
http://infostart.ru/public/181223/

Аналогичный подход использую (с мелкой хитростью) для гарантированной печати "неотрывного" подвала.
41. IsiKosta 722 21.07.16 07:38 Сейчас в теме
Возврат ВысотаДо >= ВысотаПосле;
42. Smilk 23.09.16 11:51 Сейчас в теме
ФункцияТекстУмещаетсяВЯчейке(пОбласть, пТабДок, пТекст )    
        
    ВысотаДо = ВысотаОбластиВмм(пОбласть, пТабДок);    
    
    ВремТабдок = Новый ТабличныйДокумент;
    
   	ВремТабдок .ПолеСверху                         = 0;
	ВремТабдок .ПолеСнизу                           = 0;
	ВремТабдок .РазмерКолонтитулаСверху = 0;
	ВремТабдок .РазмерКолонтитулаСнизу   = 0;
	ВремТабдок .РазмерСтраницы = "Custom";	
	ВремТабдок .ВысотаСтраницы = ВысотаДо ;
        
        пОбласть.Параметры.Значение = пТекст;

        Возврат	ВремТабдок .ПроверитьВывод(пОбласть);

КонецФункции
Показать

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


Пока НЕ ВремТабДок.ПроверитьВывод(пОбласть) Цикл 
        пОбласть.ТекущаяОбласть.Шрифт = Новый Шрифт(пОбласть.ТекущаяОбласть.Шрифт, пОбласть.ТекущаяОбласть.Шрифт.Имя, пОбласть.ТекущаяОбласть.Шрифт.Размер - 1);     
КонецЦикла;


// Или шаг уменьшения сделать больше, чтобы было меньше итераций. При таком подходе ВремТабдок создается 1 раз, а в цикле выполняется метод ПроверитьВывод(), так гораздо быстрее.
yku; BigB; +2 Ответить
43. mark_oilbass 06.06.18 20:45 Сейчас в теме
Подскажите пожалуйста, как быть когда ячейка состоит из нескольких строк? Авто высота делает ячейку сильно большой из за того что она состоит из 11 строк.
44. mark_oilbass 06.06.18 21:30 Сейчас в теме
Решил пока вопрос так: получаю первую строку с первой по последнюю колонку R1C1:R11C62 потом объединяю так как строка разбивается на ячейки.

ИмяОбласти = "R1C1:R1C62";

ОбластьСТоваром = ОбластьТаб.ПолучитьОбласть(ИмяОбласти);
ОбластьСТоваром.Область(ИмяОбласти).Объединить();
45. vasiliy_09_05 5 09.03.19 11:38 Сейчас в теме
Доброго времени суток Дамы и Господа.
Всех Дам с прошедшим праздником 8 Марта :)

Товарищи, нужна Ваша помощь!
Я понимаю, что публикация старая, но я взял ее за основу и у меня никак не выходит "Каменный цветок" :(

Смысл озвучен в публикации -подобрать шрифт под ячейку.

Но при попытке использования любого кода из публикации и комментариев программа возвращает мне не высоту строки по картинке, а среднюю погоду по России :(

Подскажите пожалуйста, что я делаю не так.
Код не выкладываю, та как он большой, выложил обработку

Буду благодарен за любую помощь!!!
Прикрепленные файлы:
BeeStock_ПечатьЭтикеток_4.epf
46. CheBurator 3404 09.03.19 17:32 Сейчас в теме
есть такая штука: ПроверитьВывод() - есои у тебя получается 2 страницы - значит - сильно лишнее, уменьшая шрифт, проверяй повторно до тех пор пока не влезет на 1 стр. Пример на 77 - можно посмотреть здесь - и адаптировать его под 8-ку.. https://infostart.ru/public/181223/
47. vasiliy_09_05 5 09.03.19 20:19 Сейчас в теме
Доброго времени суток.
Спасибо за ответ.
Этот вариант уже предложил многоуважаемый Smilk в 42 посте, но у меня так же, даже если размер шрифта over 100 в приложенной мной обработке так же показывает, что этикетка поместиться на одном листе.
Поэтому и обратился на форум, так как не пойму, то ли упустил нюансы работы с табличного документа или области, то ли затык в формировании конкретно этой обработке.

Обработка данной публикации у меня работает без проблем, а в обработе, приложенной мной не хочет работать ни с одним вариантом, предложенном в этой публикации и комментариях :(
48. Merkalov 3 05.04.19 10:47 Сейчас в теме
Долго бился, давно бы бросил, если бы не знал, что померить гребанную строку всё же возможно.

В итоге пришёл к такому варианту

Функция ПолучитьВысотуСтроки(ТабДок, ОбластьТекста, ОбластьМакета, Текст)    
	
	ОбластьМакета.Параметры.ПоСопрДокументам = Текст;
	
	ВремТабДок = Новый ТабличныйДокумент;
	ВремТабДок.Вывести(ТабДок);
	ВремТабДок.Вывести(ОбластьМакета);
	
	Область = ВремТабДок.Область(ОбластьТекста);
	Рисунок = ВремТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
	Рисунок.Расположить(Область); // вписание рисунка в область, он сам подгоняет размеры под нее
	
	Возврат Рисунок.Высота;
	
КонецФункции
Показать


ВысотаСтроки = ПолучитьВысотуСтроки(ТабДок, "R28C1:R28C1", ОбластьПоСопрДокПерваяСтрока, стрПоСопрДокументам); 


//ОбластьТекста - это Область ячеек, конкретная, на макете, можно взять первую ячейке в строке высота которой вас интересует, я так и
//сделал.
//ОбластьМакета - это Область = Макет.ПолучитьОбласть("ИмяОбласти");
//Текст - выводимый текст который нужно примерить.


И получается, что если высота строки >4 ТОГДА СЛУЧИЛСЯ ПЕРЕНОС, у обычной строки в моём макете высота 3,9, в вашем макете -нужно просто посмотреть в отладчике.

Если ВысотаСтроки > 4 Тогда
Тут решаем проблему со строкой, делим/пилим. У меня получился огромный кусок когда, но задача специфична, поэтому приводить его не вижу смысла.

Суть поста помочь новичкам, ибо я с первого раза не въехал почему у меня ничего не работает, данный пост немного разжует такому же ньюфагу как и я.
49. CheBurator 3404 05.04.19 12:54 Сейчас в теме
а есть ли в 8-ке такая вещь типа
на форме - надпись.
текст в надписи может быть переменной длины в надписб максимально возможным шрифтом.
50. user1086697 17.05.19 17:01 Сейчас в теме
Здравствуйте, определение высоты области через рисунки табличного документа выдает на многих тестах неверный результат. Поэтому долго мучаюсь и не понимаю почему такая проблема
Прикрепленные файлы:
ВысотаРисунки.epf
51. Grivba 9 19.06.19 22:50 Сейчас в теме
Сделал на основе обсуждения.
ПечатнаяФорма.ТабличныйДокумент.Вывести(Область);
//Обработка текста
Для Каждого Параметр из Область.Параметры Цикл
	ТабДок = ПечатнаяФорма.ТабличныйДокумент;
	//ТабДок.Вывести(Область);
	Ячейки = ТабДок.НайтиТекст(Параметр,,, Ложь);
	ОбластьЯчеек = ТабДок.Область(Ячейки.Верх, Ячейки.Лево);
	Если Ячейки.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить Тогда
		Если ОбластьЯчеек.АвтоВысотаСтроки Тогда
			Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
			Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
			Рисунок.Расположить(ОбластьЯчеек); 
			стВысота = Рисунок.Высота;
			ТабДок.Рисунки.Удалить(Рисунок);
			ОбластьЯчеек.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
			
			ВремТабДок = Новый ТабличныйДокумент;
			ВремТабДок.Вывести(ТабДок.ПолучитьОбласть(Ячейки.Имя));
			
			ЯчейкиВремТабДок = ВремТабДок.НайтиТекст(Параметр,,, Ложь);
			измОбластьЯчеек = ВремТабДок.Область(ЯчейкиВремТабДок.Верх, ЯчейкиВремТабДок.Лево);
			измОбластьЯчеек.ШиринаКолонки = ОбластьЯчеек.ШиринаКолонки;
			измОбластьЯчеек.ВысотаСтроки = 0;					
			измОбластьЯчеек.АвтоВысотаСтроки = Истина;
			Рисунок = ВремТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
			Рисунок.Расположить(измОбластьЯчеек); 
			Высота = Рисунок.Высота;
			Размер = Ячейки.Шрифт.Размер;
			
			Шрифт = ЯчейкиВремТабДок.Шрифт;
			
			Пока стВысота <= Высота Цикл
				Размер = ЯчейкиВремТабДок.Шрифт.Размер;
				ВремТабДок.Рисунки.Удалить(Рисунок);
				Шрифт = ЯчейкиВремТабДок.Шрифт;
				ЯчейкиВремТабДок.Шрифт = Новый Шрифт(Шрифт,, Размер-1);
				Рисунок = ВремТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
				Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
				Рисунок.Расположить(измОбластьЯчеек); 
				Высота = Рисунок.Высота;
			КонецЦикла;
		    Ячейки.Шрифт = Шрифт;
			ТабДок.Рисунки.Удалить(Рисунок);
		Иначе
			стВысота = 0;
			РазборАдреса = ОбластьЯчеек.Имя;
			
			РезультатАдрес = "";
			
			РазборАдреса = СтрЗаменить(РазборАдреса, ":", "_");
			
			//Ищем буквы
			Для Сч =1 По СтрДлина(РазборАдреса) Цикл
				Знак = Сред(РазборАдреса, Сч,1);
				Если Найти("0123456789",Знак)>0 Тогда
					РезультатАдрес = РезультатАдрес+"_";
				Иначе
					РезультатАдрес = РезультатАдрес+Строка(Знак);
				КонецЕсли;
			КонецЦикла;
			
			мБуквенныхАдресов = СтрРазделить(РезультатАдрес, "_", Ложь);
			РезультатАдрес = "";
			//Ищем цифры
			Для Сч =1 По СтрДлина(РазборАдреса) Цикл
				Знак = Сред(РазборАдреса, Сч,1);
				Если Найти("0123456789",Знак)>0 Тогда
					РезультатАдрес = РезультатАдрес+Строка(Знак);
				Иначе
					РезультатАдрес = РезультатАдрес+"_";
				КонецЕсли;
			КонецЦикла;
				
			мЦифровыхАдресов = СтрРазделить(РезультатАдрес, "_", Ложь);
			
			Если мЦифровыхАдресов.Количество()>2 Тогда
				ЭтоОбласть = Истина;
			Иначе
				ЭтоОбласть = Ложь;
			КонецЕсли;
			
			НачальныйСчетчик = Число(мЦифровыхАдресов.Получить(0));
			КонечныйСчетчик = ?(мЦифровыхАдресов.Количество()>2, Число(мЦифровыхАдресов.Получить(2)), Число(мЦифровыхАдресов.Получить(0)));
			
			Пока НачальныйСчетчик <= КонечныйСчетчик Цикл
				
				ИскомыйАдрес = мБуквенныхАдресов[0]+НачальныйСчетчик+мБуквенныхАдресов[1]+мЦифровыхАдресов[1];
				стВысота = стВысота+ТабДок.ПолучитьОбласть(ИскомыйАдрес).ВыделенныеОбласти[0].ВысотаСтроки;											
				НачальныйСчетчик = НачальныйСчетчик+1;
				
			КонецЦикла;
			
			ВремТабДок = Новый ТабличныйДокумент;
			ВремТабДок.Вывести(ТабДок.ПолучитьОбласть(Ячейки.Имя));
			ЯчейкиВремТабДок = ВремТабДок.НайтиТекст(Параметр,,, Ложь);
			измОбластьЯчеек = ВремТабДок.Область(ЯчейкиВремТабДок.Верх, ЯчейкиВремТабДок.Лево);
			измОбластьЯчеек.ШиринаКолонки = ?(ОбластьЯчеек.ШиринаКолонки=0,Ячейки.ШиринаКолонки, ОбластьЯчеек.ШиринаКолонки);
			измОбластьЯчеек.ВысотаСтроки = 0;					
			измОбластьЯчеек.АвтоВысотаСтроки = Истина;
			Рисунок = ВремТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
			Рисунок.Расположить(измОбластьЯчеек); 
			Высота = Рисунок.Высота;
			Размер = Ячейки.Шрифт.Размер;
			
			Шрифт = ЯчейкиВремТабДок.Шрифт;
			
			Пока стВысота <= Высота Цикл
				Размер = ЯчейкиВремТабДок.Шрифт.Размер;
				ВремТабДок.Рисунки.Удалить(Рисунок);
				Шрифт = ЯчейкиВремТабДок.Шрифт;
				ЯчейкиВремТабДок.Шрифт = Новый Шрифт(Шрифт,, Размер-1);
				Рисунок = ВремТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
				Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
				Рисунок.Расположить(измОбластьЯчеек); 
				Высота = Рисунок.Высота;
			КонецЦикла;
		    Ячейки.Шрифт = Шрифт;
			ТабДок.Рисунки.Удалить(Рисунок);

			
			
			КонецЕсли;
	КонецЕсли;								

КонецЦикла;
Показать


Работает на 100%, когда нет одинаковых параметров, т.е. один и тот же параметр выведен в области используется только 1 раз.
52. Grivba 9 20.06.19 19:37 Сейчас в теме
(51) Ошибка вышла. На тесте с простыми табличными документами все отрабатывало норм.
Перенес на основу..... Все рухнуло.
Пришлось все переделывать.

Цель - в зависимости от длинны теста в параметре (в макете минимум обычного текста, остальное параметры, шаблоны) подбирать максимально близкий размер текста к указанному в макете.

Перенес начало работы с размером текста на Макет (все пытаются это сделать на ТабДоке).
1. Заполняем нужный нам параметр.
	Область.Параметры[ПараметрШаблона.Значение] = СтрокаДанных[НаименованиеКолонки]; 

2. Получаем область ячеек (вдруг область объединенная, у меня такие все)
Ячейка = Область.НайтиТекст(ПараметрШаблона.Значение);
ОбластьЯчеек = Область.Область(Ячейка.Верх, Ячейка.Лево);

3. Узнаем размер ячейки
Рисунок = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);
Рисунок.Расположить(ОбластьЯчеек); 
стВысота = Рисунок.Высота;                     //высота нашей ячейки 
стШирина = Рисунок.Ширина;                   //Ширина ячейки
Область.Рисунки.Удалить(Рисунок);        //удаляем рисунок

4. Создаем временный ТабДок в который будем выводить текст
ВремТабДок = Новый ТабличныйДокумент;
ВремТабДок.Вывести(Область.ПолучитьОбласть(Ячейка.Имя));

При этом в него переносим Только текст (в ячейке у нас только текст)
6. А далее самое интересное.
В табличный документ в 1-у ячейку (получается - R1C1) мы переносим текст, и после этого устанавливаем ее размеры
При этом высота ячеек установится сама а вот Ширину колонки необходимо рассчитать и в этом поможет стШирина. При этом не забываем что по какой то волшебной причине, ед изм ширины колонок не соответствует ед изм ширины рисунка. (присвоить ширину старой ячейки не выйдет, и старой области ячеек аналогично)

	ЯчейкиВремТабДок = ВремТабДок.НайтиТекст(СтрокаДанных[НаименованиеКолонки],,, Ложь); 
	измОбластьЯчеек = ВремТабДок.Область(ЯчейкиВремТабДок.Верх, ЯчейкиВремТабДок.Лево);
	измОбластьЯчеек.ШиринаКолонки = (стШирина/1.85)-1;          //вычисляем ширину колонки и отнимаем 1 единицу для гарантии.
	измОбластьЯчеек.ВысотаСтроки = 0;					
	измОбластьЯчеек.АвтоВысотаСтроки = Истина;
	измОбластьЯчеек.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
	Рисунок = ВремТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);
	Рисунок.Расположить(измОбластьЯчеек); 
	Высота = Рисунок.Высота;
	Размер = Ячейка.Шрифт.Размер;

Показать


7. Ну а далее простой перебор

		Шрифт = ЯчейкиВремТабДок.Шрифт;
					
	        Пока стВысота <= Высота Цикл

		Если Размер = 2 Тогда
			Прервать;                      //Защита от дурака
		КонецЕсли;

		Размер = ЯчейкиВремТабДок.Шрифт.Размер;
		ВремТабДок.Рисунки.Удалить(Рисунок);
		Шрифт = ЯчейкиВремТабДок.Шрифт;
		ЯчейкиВремТабДок.Шрифт = Новый Шрифт(Шрифт,, Размер-1);
		Рисунок = ВремТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
		Рисунок.Расположить(измОбластьЯчеек); 
		Высота = Рисунок.Высота;
	КонецЦикла;

	ОбластьЯчеек.Шрифт = Новый Шрифт(Шрифт,, Размер-1);          //В очередной раз уменьшаем шрифт. 
	Область.Рисунки.Удалить(Рисунок);

Показать


И УСЕ, потом выводим макет в таб док. Надеюсь я не пытаюсь изобрести велосипед.
Оставьте свое сообщение

См. также

Полезные процедуры и функции для программиста

Статья Программист Нет файла v8 1cv8.cf Россия Абонемент ($m) Практика программирования Универсальные функции

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

1 стартмани

07.10.2019    15185    4    HostHost    24       

Открыто голосование за доклады на INFOSTART MEETUP Krasnodar Промо

Выбирайте и голосуйте за самые интересные доклады, лучшие из них попадут в окончательную программу митапа. Голосование продлится до 30 января 2020 года.

Описание формата внутреннего представления данных 1С в контексте обмена данными

Статья Программист Внешняя обработка (ert,epf) v8 v8::УФ 1cv8.cf Абонемент ($m) Практика программирования Внешние источники данных Разработка

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    8296    7    Dementor    27       

Размещение текста в ячейке табличного документа

Отчеты и формы Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Печатные формы документов Универсальные обработки

Набор процедур и функций для подбора такого максимального размера шрифта ячейки табличного документа, при котором текст целиком помещается в ячейке. Последний раз обработка успешно протестирована на релизе 1С:Предприятие 8.3, учебная версия (8.3.8.1933).

1 стартмани

29.08.2019    1643    user847462    2       

Управление ИТ-проектами. Модуль 2: продвинутый онлайн-курс по классическим методам управления проектами. Вебинары проходят с 12 марта по 11 июня 2020 года. Промо

Продвинутый онлайн-курс по классическому управлению ИТ-проектами позволит слушателям освоить инструменты из PMBoK® и 1С:Технологии корпоративного внедрения и научиться их применять для проектов любого масштаба. Курс включает в себя 12 вебинаров и 12 видеолекции, разбор кейсов и рекомендации экспертов по проектам слушателей. Ведущая курса - Мария Темчина.

от 13000 рублей

Вам нравятся запросы в 1С?

Инструменты и обработки Программист Конфигурация (md, cf) v8 v8::Запросы 1cv8.cf Абонемент ($m) Практика программирования Разработка

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    12686    1    m-rv    79       

Онлайн-курс "Подготовка к экзамену 1С:Эксперт и 1С:Профессионал по технологическим вопросам" с 7 по 24 апреля 2020 г. Промо

На курсе вы получите практические навыки решения задач производительности 1С, в том числе характерных для высоконагруженных информационных систем (более 1000 пользователей). Подготовка к экзамену – только одна из составляющих курса. 70% слушателей приходят за знаниями, которые позволят расти и зарабатывать, делать сложные задачи на крупных проектах.

16450 рублей

1С:Ассемблер. Немного летнего веселья!

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Практика программирования Разработка

Все вы, наверное, слышали, что 1С-ники жалуются на свою систему, считая язык 1С недостаточно низкоуровневым, скучным и т.п. Все они с тоской поглядывают в сторону "настоящих" языков программирования. Так вот, господа, они неправы. В системе 1С есть места, где можно размять программерский мозг и получить удовольствие от низкоуровневой техники. Предлагаю вам погрузиться в недра виртуальной машины 1С и понять, как она работает. Там есть свой "ассемблер" и мы попробуем его в действии!

1 стартмани

21.06.2019    17925    55    Evil Beaver    116       

Простые примеры сложных отчетов на СКД

Статья Программист Архив с данными v8 v8::СКД 1cv8.cf Абонемент ($m) Практика программирования

Подписи в отчете. Особенности соединения наборов: как соединить несоединяемое. Остатки на дату и обороты по месяцам в одном отчете. Курс валюты на каждую дату без группировок и соединений в запросе. Отчет с произвольными колонками и с произвольной последовательностью. "Неадекватный отчет".

1 стартмани

12.06.2019    17913    16    Hatson    22       

Базовый курс для начинающих 1С-программистов. Пятый поток. Онлайн-курс с 12 февраля по 15 апреля 2020 г. Промо

Данный онлайн-курс является начальной ступенью по изучению базовых принципов программирования в системе “1С:Предприятие” и предназначен для обучения 1С-программированию “с нуля”.

4500/9500 рублей

Безопасная работа с транзакциями во встроенном языке

Статья Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    19738    8    tormozit    44       

Сдача регламентированной отчетности из программ 1С Промо

Сдача регламентированной отчетности из программ "1С" во все контролирующие органы без выгрузок и загрузок в другие программы. Для групп компаний действуют специальные предложения.

от 1500 руб.

HTML в новой версии 8.3.14 на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Универсальные обработки Практика программирования Разработка

Тестируем возможности HTML в новой версии 8.3.14 платформы на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX.

1 стартмани

29.01.2019    17808    70    Synoecium    40       

Отладка сложных отчетов на СКД

Отчеты и формы Программист Расширение (cfe) v8 v8::СКД 1cv8.cf Россия Абонемент ($m) Практика программирования

Расширение для отладки сложных отчетов на СКД (в т.ч. для собираемых программно "на лету") и быстрого перехода к отладке таких отчетов в консоли запросов и отчетов на СКД.

1 стартмани

28.12.2018    17303    63    maxx    58       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Работа с публикациями "Инфостарт"

Инструменты и обработки Программист Архив с данными v8 УУ Абонемент ($m) Практика программирования О сообществе WEB

Работа с рублевыми публикациями на сайте "Инфостарт": ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.

1 стартмани

13.09.2018    11792    12    RocKeR_13    16       

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции

Инструменты и обработки Программист Бизнес-аналитик Приложение (apk) v8 Windows Абонемент ($m) Инструментарий разработчика Практика программирования

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    18546    23    informa1555    26       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Работа с данными выбора

Инструменты и обработки Программист Архив с данными v8 Россия Абонемент ($m) Практика программирования Работа с интерфейсом

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

1 стартмани

17.07.2018    27050    16    kalyaka    16       

HTTP Сервисы: Путь к своему сервису. Часть 1

Статья Системный администратор Программист Расширение (cfe) v8 1cv8.cf Абонемент ($m) Практика программирования WEB

Уже много было написано про http-сервисы, но то и дело всплывают «Новые» статьи по обмену между базами V8 по COM, что «Немножко» удивляет. Решил внести свои 5 копеек, поработаем с http-сервисом.

1 стартмани

15.07.2018    48191    19    dsdred    24       

Подборка программ для взаимодействия с ЕГАИС Промо

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

ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар")

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 v8::Запросы 1cv8.cf Абонемент ($m) Практика программирования

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

1 стартмани

01.06.2018    21903    86    m-rv    57       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Практика программирования БСП (Библиотека стандартных подсистем)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    31871    30    dsdred    36       

Как выполнить отчет на СКД через COM и получить данные отчета?

Статья Программист Архив с данными v8 УПП1 Россия Windows Абонемент ($m) Практика программирования

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    20027    10    wowik    3       

1C:Предприятие для программистов: Запросы и отчеты. Второй поток. Онлайн-интенсив с 17 марта по 16 апреля 2020 г. Промо

Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения.

6500 рублей

Работа со схемой запроса

Статья Программист Конфигурация (md, cf) v8 v8::Запросы Абонемент ($m) Инструментарий разработчика Практика программирования

Стандартом взаимодействия с реляционной базой данных стал язык SQL. Приемником SQL в 1С является язык запросов. Язык запросов, также как и SQL, является структурированным. Составляющие структуры запроса отвечают на разные вопросы о том, какие данные требуется получить и какие манипуляции с множествами данных необходимо произвести при получении. В простых случаях текст запроса можно написать вручную, однако в сложных случаях, а также при программном формировании, - лучше воспользоваться объектной моделью запроса и использовать объект "Схема запроса". В статье дается описание объектной модели и особенностей работы с ней, а также приводится решение, упрощающее взаимодействие с объектом "Схема запроса".

1 стартмани

24.04.2018    32055    77    kalyaka    34       

Заполняем по шаблону (по умолчанию)

Инструменты и обработки Программист Архив с данными v8 v8::УФ 1cv8.cf Абонемент ($m) Практика программирования

Простой в подключении, универсальный и достаточно удобный механизм заполнения реквизитов произвольных документов/справочников значениями по умолчанию. Реализован в расширении, но может быть и непосредственно включен практически в любую конфигурацию на управляемых формах простым копированием одной формы и двух команд. Весь код в статье.

1 стартмани

08.02.2018    19713    20    mvxyz    17       

Онлайн-курс «Практические аспекты внедрения регламентированного учета и расчета себестоимости в 1С:ERP на крупных промышленных предприятиях» с 17 февраля по 13 марта 2020 года. Промо

Курс рассчитан для подготовки экспертов по регламентированному учету и учету затрат для внедрения на крупных промышленных предприятиях с «исторически сложившимся» учетом

9000 рублей

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов

Статья Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    27659    63    rpgshnik    48       

Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула

Отчеты и формы Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Печатные формы документов Практика программирования Универсальные функции

Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.

1 стартмани

29.12.2017    26454    25    agent00mouse    0       

PgConf.Russia 2020. 3-5 февраля 2020 г. Москва. Промо

PGConf.Russia – международная техническая конференция по открытой СУБД PostgreSQL, ежегодно собирающая более 700 разработчиков, администраторов баз данных и IT-менеджеров для обмена опытом и профессионального общения. Для участников сообщества infostart.ru скидка 5% на участие в конференции.

от 12350 рублей

Практика доступа в базу 1С через протокол oData. Чтение данных

Статья Системный администратор Программист Бизнес-аналитик Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Сервисные утилиты Практика программирования Администрирование данных 1С

Для чего нужен доступ в базу 1С через REST-интерфейс по протокол oData? Как его организовать? Как не будучи гуру в JavaScript и .NET получить быстрый визуальный доступ к данным базы 1С? Попробую дать ответ на эти вопросы и прокомментирую некоторые нюансы, с которыми я столкнулся.

1 стартмани

11.12.2017    67548    266    Dementor    44       

Печатная форма, сделанная как расширение конфигурации для БП 3.0. Новые возможности БСП

Инструменты и обработки Программист Расширение (cfe) v8 БП3.0 Абонемент ($m) Практика программирования Универсальные печатные формы

Печатные формы на внешних обработках скоро канут в лету. На смену им приходят ПФ, реализованные в виде расширений конфигурации. Не нашел на сайте примеров таких расширений. Привожу пример подобного расширения для БП 3.0.

1 стартмани

06.12.2017    20433    52    kwazi    6