Имя: Пароль:
1C
1С v8
Возможно-ли програмно сохранить выведенный отчет на диск с нужным разрешением?
,
0 IBTM
 
19.10.11
21:40
Например:
сохранить сформированный расчетный листок в программе на диск с разрешением .html именно в том виде как формирует программа (ЗУП). Чтото типо действия "сохранить как". Это вообще реально сделать? Зарание спасибо!
1 Grusswelle
 
19.10.11
21:40
Да.
2 zak555
 
19.10.11
21:40
шитфт+контра+эС ?
3 almar
 
19.10.11
21:41
(0) Разрешение или Расширение?
4 Азат
 
19.10.11
21:42
Вообще реально
5 IBTM
 
19.10.11
21:42
(1) где про это можно прочесть, подскажите ресурс...
6 IBTM
 
19.10.11
21:44
(3) Расширение! :)
7 IBTM
 
19.10.11
22:06
Подскажите пжлста на ИТСе это есть?
8 Азат
 
19.10.11
22:06
(7) я тебе больше скажу, это в синтакс-помощнике есть
9 IBTM
 
19.10.11
22:09
(8) можешь чуть по точнее сказать? :(
10 IBTM
 
19.10.11
23:15
ТабДок.Записать записывает прекрасно работает, но! Открываю файл - обсалютно нечитаем, что не так делаю? Как добиться индентичности с "сохранить как". Прошу помощи!!!
11 Азат
 
19.10.11
23:33
(10) какие параметры в Записать передаешь?
12 IBTM
 
19.10.11
23:36
(11) ТабДокумент.Записать("D:\RList.html");
13 Zolotko
 
19.10.11
23:37
кодировку еще добавь
14 IBTM
 
19.10.11
23:43
(13) не пойму какую и куда... в помошнике про кодировку табличного документа тишина.
Вот у текстового дока вижу...
15 IBTM
 
19.10.11
23:43
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:

Записать(<ИмяФайла>, <ТипФайлаТаблицы>)
Параметры:

<ИмяФайла> (обязательный)

Тип: Строка. Имя файла, в котором сохраняется табличный документ.
<ТипФайлаТаблицы> (необязательный)

Тип: ТипФайлаТабличногоДокумента. Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL
Описание:

Записывает табличный документ в файл.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Примечание:

При работе на сервере, веб клиенте или через внешнее соединение нет возможности сохранять в формате XLS95.
При работе на веб-клиенте вызов метода выполняет обращение к серверу.
Пример:

ТабДок.Записать("C:\My Documents\Таблица2.mxl");
16 Zolotko
 
19.10.11
23:44
ты когда его открываешь у тебя просто колонки съезжают?
может проще в лист экселя сохранить?
17 IBTM
 
19.10.11
23:57
Все форматы перепробывал. Чувствую дело не в колонках!

Мой результат:
http://saveimg.ru/show-image.php?id=c2ca9033c570f4edaebfbd608d7bfc07

Оригинал:
http://saveimg.ru/show-image.php?id=f54b75552137678884a2aef6841e8d02

Может что подскажешь...?
18 Zolotko
 
20.10.11
00:12
печалька, с кодировкой явный косяк
19 kotletka
 
20.10.11
00:16
(17)он у тебя в xls и не сохраняется, в мокселе остается,а он экселем криво открывается, если не на серваке и не внешним соединением попробуй
"ТабДок.Записать("C:\My Documents\Таблица2.xls")"
20 Азат
 
20.10.11
00:17
чот имхо автор не договаривает что-то...
21 kotletka
 
20.10.11
00:21
так код хочется глянуть, хоть поржать
22 IBTM
 
20.10.11
00:31
(18) Тоже самое...

перед открытием:
http://saveimg.ru/show-image.php?id=6f61673e9708d9aa2aae56f747a33502
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

Код типовой, добавлена мной последняя строчка.

Процедура ПечатьСправкиПоРегламентированнымОтпускамСотрудника(Сотрудник, ДатаУвольнения = Неопределено, Регистратор = Неопределено) Экспорт
   
   ФорматДаты = "ДФ='d MMM yyyy ""г.""'";
   ДлинаСуток = 86400;
   
   КомпонентаСклоненияФИО = глЗначениеПеременной("глКомпонентаСклоненияФИО");
   
   Макет = ПолучитьОбщийМакет("СправкаПоОтпускамСотрудника");
   
   ТабДокумент = Новый ТабличныйДокумент;
   ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СправкаПоРегламентированнымОтпускамСотрудника";
   
   Запрос = Новый Запрос;
   
   // Если передан регистратор, необходимо исключить как движения регистратора,
   // так и движения всех документов исправлений этого регистратора.
   Если Регистратор <> Неопределено Тогда
       МассивДокументов = Новый Массив;
       МассивДокументов.Добавить(Регистратор);
       
       МетаданныеРегистратора = Регистратор.Метаданные();
       Если МетаданныеРегистратора.Реквизиты.Найти("ПерерассчитываемыйДокумент") <> Неопределено Тогда
           Запрос.Текст =
           "ВЫБРАТЬ
           |    Док.ПерерассчитываемыйДокумент
           |ИЗ
           |    Документ." + МетаданныеРегистратора.Имя + " КАК Док
           |ГДЕ
           |    Док.Ссылка = &Ссылка";
           
           Ссылка = Регистратор;
           Пока Ссылка <> Неопределено Цикл
               Запрос.УстановитьПараметр("Ссылка",    Ссылка);
               Выборка = Запрос.Выполнить().Выбрать();
               Если Выборка.Следующий() Тогда
                   Ссылка = Выборка.ПерерассчитываемыйДокумент;
                   МассивДокументов.Добавить(Ссылка);
               Иначе
                   Ссылка = Неопределено;
               КонецЕсли;
           КонецЦикла;
           
           Запрос.Текст =
           "ВЫБРАТЬ
           |    Док.Ссылка
           |ИЗ
           |    Документ." + МетаданныеРегистратора.Имя + " КАК Док
           |ГДЕ
           |    Док.ПерерассчитываемыйДокумент = &Ссылка";
           
           Ссылка = Регистратор;
           Пока Ссылка <> Неопределено Цикл
               Запрос.УстановитьПараметр("Ссылка",    Ссылка);
               Выборка = Запрос.Выполнить().Выбрать();
               Если Выборка.Следующий() Тогда
                   Ссылка = Выборка.Ссылка;
                   МассивДокументов.Добавить(Ссылка);
               Иначе
                   Ссылка = Неопределено;
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
       
       Запрос.УстановитьПараметр("МассивДокументов",    МассивДокументов);
   КонецЕсли;
   
   Запрос.УстановитьПараметр("Сотрудник",        Сотрудник);
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    СотрудникиОрганизаций.Ссылка КАК Сотрудник,
   |    СотрудникиОрганизаций.ДатаПриемаНаРаботу КАК ДатаПриема,
   |    СотрудникиОрганизаций.ТекущееПодразделениеОрганизации КАК Подразделение,
   |    СотрудникиОрганизаций.ТекущаяДолжностьОрганизации КАК Должность,
   |    СотрудникиОрганизаций.Физлицо.Пол КАК Пол,
   |    СотрудникиОрганизаций.ТекущееОбособленноеПодразделение КАК ОбособленноеПодразделение,
   |    ВЫБОР
   |        КОГДА СотрудникиОрганизаций.ДатаУвольнения > СотрудникиОрганизаций.ДатаПриемаНаРаботу
   |            ТОГДА СотрудникиОрганизаций.ДатаУвольнения
   |        ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
   |    КОНЕЦ КАК ДатаУвольнения
   |ИЗ
   |    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
   |ГДЕ
   |    СотрудникиОрганизаций.Ссылка = &Сотрудник";
   
   Выборка = Запрос.Выполнить().Выбрать();
   
   ДатаПриема = Дата(1,1,1);
   Если Выборка.Следующий() Тогда
       ДатаПриема = Выборка.ДатаПриема;
       
       ОбластьМакета = Макет.ПолучитьОбласть("ОбщиеДанные");
       ОбластьМакета.Параметры.Заполнить(Выборка);
       ТабДокумент.Вывести(ОбластьМакета);
       
       ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
       ОбластьМакета.Параметры.Период        = Формат(ДатаПриема, ФорматДаты);
       Если Выборка.Пол = Перечисления.ПолФизическихЛиц.Женский Тогда
           ОбластьМакета.Параметры.Комментарий    = "Принята на работу";
       Иначе
           ОбластьМакета.Параметры.Комментарий    = "Принят на работу";
       КонецЕсли;
       ТабДокумент.Вывести(ОбластьМакета);
   КонецЕсли;
   
   Если ДатаУвольнения = Неопределено Тогда
       СотрудникУволен        = ЗначениеЗаполнено(Выборка.ДатаУвольнения);
       ДатаАктуальности    = ?(СотрудникУволен, Выборка.ДатаУвольнения, ОбщегоНазначения.ПолучитьРабочуюДату());
   Иначе
       СотрудникУволен        = Ложь;
       ДатаАктуальности    = ДатаУвольнения;
   КонецЕсли;
   
   // Таблица введенных остатков отпусков
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ОстаткиСрез.ДатаОкончанияРабочегоГода КАК Период,
   |    ОстаткиОтпусковОстатки.ВидЕжегодногоОтпуска.Наименование КАК ВидЕжегодногоОтпуска,
   |    СУММА(ОстаткиОтпусковОстатки.Количество) КАК Количество
   |ИЗ
   |    Справочник.ОстаткиОтпусковОрганизаций.Остатки КАК ОстаткиОтпусковОстатки
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
   |            ВложенныйЗапрос.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
   |            МАКСИМУМ(ВложенныйЗапрос.ДатаОкончанияРабочегоГода) КАК ДатаОкончанияРабочегоГода,
   |            ВложенныйЗапрос.ДатаАктуальности КАК ДатаАктуальности
   |        ИЗ
   |            (ВЫБРАТЬ
   |                ОстаткиОтпусковОрганизацийОстатки.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
   |                ОстаткиОтпусковОрганизацийОстатки.ДатаОкончанияРабочегоГода КАК ДатаОкончанияРабочегоГода,
   |                МАКСИМУМ(ОстаткиОтпусковОрганизацийОстатки.Ссылка.ДатаАктуальности) КАК ДатаАктуальности
   |            ИЗ
   |                Справочник.ОстаткиОтпусковОрганизаций.Остатки КАК ОстаткиОтпусковОрганизацийОстатки
   |            ГДЕ
   |                ОстаткиОтпусковОрганизацийОстатки.Ссылка.Сотрудник = &Сотрудник
   |            
   |            СГРУППИРОВАТЬ ПО
   |                ОстаткиОтпусковОрганизацийОстатки.ВидЕжегодногоОтпуска,
   |                ОстаткиОтпусковОрганизацийОстатки.ДатаОкончанияРабочегоГода) КАК ВложенныйЗапрос
   |        
   |        СГРУППИРОВАТЬ ПО
   |            ВложенныйЗапрос.ВидЕжегодногоОтпуска,
   |            ВложенныйЗапрос.ДатаАктуальности) КАК ОстаткиСрез
   |        ПО ОстаткиОтпусковОстатки.ВидЕжегодногоОтпуска = ОстаткиСрез.ВидЕжегодногоОтпуска
   |            И ОстаткиОтпусковОстатки.Ссылка.ДатаАктуальности = ОстаткиСрез.ДатаАктуальности
   |            И (ОстаткиОтпусковОстатки.Ссылка.Сотрудник = &Сотрудник)
   |
   |СГРУППИРОВАТЬ ПО
   |    ОстаткиСрез.ДатаОкончанияРабочегоГода,
   |    ОстаткиОтпусковОстатки.ВидЕжегодногоОтпуска.Наименование
   |
   |УПОРЯДОЧИТЬ ПО
   |    Период,
   |    ВидЕжегодногоОтпуска
   |ИТОГИ
   |    СУММА(Количество)
   |ПО
   |    Период";
   ТаблицаОстатков = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   // Таблица компенсаций отпусков
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ФактическиеОтпускаОрганизаций.Период КАК ДатаКомпенсации,
   |    ФактическиеОтпускаОрганизаций.Количество КАК ДнейКомпенсации
   |ИЗ
   |    РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпускаОрганизаций
   |ГДЕ
   |    ФактическиеОтпускаОрганизаций.Сотрудник = &Сотрудник
   |    " + ?(Регистратор = Неопределено, "", "И (НЕ ФактическиеОтпускаОрганизаций.Регистратор В (&МассивДокументов))") + "
   |    И ФактическиеОтпускаОрганизаций.Компенсация
   |
   |УПОРЯДОЧИТЬ ПО
   |    ДатаКомпенсации";
   ТаблицаКомпенсаций = Запрос.Выполнить().Выгрузить();
   
   // Таблица отсутствий, которые увеличивают рабочий год
   Запрос.УстановитьПараметр("ТекущаяДата",    ДатаАктуальности);
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    СостояниеРаботниковОрганизаций.Период КАК Период,
   |    СостояниеРаботниковОрганизаций.Состояние КАК Состояние,
   |    СостояниеРаботниковОрганизаций.ПериодЗавершения КАК ПериодЗавершения,
   |    СостояниеРаботниковОрганизаций.СостояниеЗавершения
   |ПОМЕСТИТЬ ВТСостояние
   |ИЗ
   |    РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
   |ГДЕ
   |    СостояниеРаботниковОрганизаций.Сотрудник = &Сотрудник
   |    И СостояниеРаботниковОрганизаций.Состояние В (ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускБезСохраненияЗарплаты), ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускПоУходуЗаРебенком), ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Прогулы))
   |
   |ИНДЕКСИРОВАТЬ ПО
   |    Период,
   |    ПериодЗавершения
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    СостояниеРаботниковОрганизаций.Период КАК ПериодНачала,
   |    МИНИМУМ(СостояниеРаботниковОрганизацийЗавершения.Период) КАК ДатаСреза
   |ПОМЕСТИТЬ ВТСрезСостояний
   |ИЗ
   |    РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизацийЗавершения
   |        ПО (СостояниеРаботниковОрганизаций.Сотрудник = &Сотрудник)
   |            И (СостояниеРаботниковОрганизацийЗавершения.Сотрудник = &Сотрудник)
   |            И СостояниеРаботниковОрганизаций.Период < СостояниеРаботниковОрганизацийЗавершения.Период
   |            И (СостояниеРаботниковОрганизаций.Состояние В (ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускБезСохраненияЗарплаты), ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускПоУходуЗаРебенком), ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Прогулы)))
   |
   |СГРУППИРОВАТЬ ПО
   |    СостояниеРаботниковОрганизаций.Период
   |
   |ИНДЕКСИРОВАТЬ ПО
   |    ПериодНачала,
   |    ДатаСреза
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ВТСрезСостояний.ПериодНачала КАК ПериодНачала,
   |    СостояниеРаботниковОрганизацийЗавершения.Период КАК Период,
   |    СостояниеРаботниковОрганизацийЗавершения.Состояние
   |ПОМЕСТИТЬ ВТСостояниеЗавершения
   |ИЗ
   |    ВТСрезСостояний КАК ВТСрезСостояний
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизацийЗавершения
   |        ПО (СостояниеРаботниковОрганизацийЗавершения.Сотрудник = &Сотрудник)
   |            И ВТСрезСостояний.ДатаСреза = СостояниеРаботниковОрганизацийЗавершения.Период
   |
   |ИНДЕКСИРОВАТЬ ПО
   |    ПериодНачала,
   |    Период
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    РАЗНОСТЬДАТ(СостояниеРаботников.ДатаНачалаОтпуска, СостояниеРаботников.ДатаОкончанияОтпуска, ДЕНЬ) КАК КоличествоДнейОтпуска,
   |    СостояниеРаботников.ДатаНачалаОтпуска КАК ДатаНачалаОтпуска,
   |    ДОБАВИТЬКДАТЕ(СостояниеРаботников.ДатаОкончанияОтпуска, ДЕНЬ, -1) КАК ДатаОкончанияОтпуска,
   |    СостояниеРаботников.Состояние,
   |    РАЗНОСТЬДАТ(СостояниеРаботников.ДатаНачалаОтпуска, СостояниеРаботников.ДатаОкончанияОтпуска, ДЕНЬ) КАК КоличествоДнейПродления,
   |    СостояниеРаботников.ДатаНачалаОтпуска КАК ДатаНачалаПродления
   |ИЗ
   |    (ВЫБРАТЬ
   |        СостояниеРаботниковОрганизаций.Период КАК ДатаНачалаОтпуска,
   |        ВЫБОР
   |            КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
   |                    И (СостояниеРаботниковОрганизацийЗавершения.Период ЕСТЬ NULL
   |                        ИЛИ СостояниеРаботниковОрганизацийЗавершения.Период > СостояниеРаботниковОрганизаций.ПериодЗавершения)
   |                ТОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения
   |            КОГДА ЕСТЬNULL(СостояниеРаботниковОрганизацийЗавершения.Период, ДАТАВРЕМЯ(1, 1, 1)) <> ДАТАВРЕМЯ(1, 1, 1)
   |                ТОГДА СостояниеРаботниковОрганизацийЗавершения.Период
   |            ИНАЧЕ ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, 1)
   |        КОНЕЦ КАК ДатаОкончанияОтпуска,
   |        СостояниеРаботниковОрганизаций.Состояние КАК Состояние,
   |        ВЫБОР
   |            КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
   |                    И (СостояниеРаботниковОрганизацийЗавершения.Период ЕСТЬ NULL
   |                        ИЛИ СостояниеРаботниковОрганизацийЗавершения.Период > СостояниеРаботниковОрганизаций.ПериодЗавершения)
   |                ТОГДА СостояниеРаботниковОрганизаций.СостояниеЗавершения
   |            КОГДА ЕСТЬNULL(СостояниеРаботниковОрганизацийЗавершения.Период, ДАТАВРЕМЯ(1, 1, 1)) <> ДАТАВРЕМЯ(1, 1, 1)
   |                ТОГДА СостояниеРаботниковОрганизацийЗавершения.Состояние
   |            ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Работает)
   |        КОНЕЦ КАК СостояниеЗавершения
   |    ИЗ
   |        ВТСостояние КАК СостояниеРаботниковОрганизаций
   |            ЛЕВОЕ СОЕДИНЕНИЕ ВТСостояниеЗавершения КАК СостояниеРаботниковОрганизацийЗавершения
   |            ПО СостояниеРаботниковОрганизаций.Период < СостояниеРаботниковОрганизацийЗавершения.Период
   |                И СостояниеРаботниковОрганизаций.Период = СостояниеРаботниковОрганизацийЗавершения.ПериодНачала) КАК СостояниеРаботников
   |
   |УПОРЯДОЧИТЬ ПО
   |    ДатаНачалаОтпуска";
   ТаблицаИсключаемыхОтпусков = Запрос.Выполнить().Выгрузить();
   
   // Таблица фактических отпусков
   Запрос.Текст =
   "ВЫБРАТЬ
   |    0 КАК НомерСтроки,
   |    ФактическиеОтпускаОрганизаций.Сотрудник КАК Сотрудник,
   |    ФактическиеОтпускаОрганизаций.Период КАК ДатаНачала,
   |    ФактическиеОтпускаОрганизаций.ДатаОкончания КАК ДатаОкончания,
   |    ФактическиеОтпускаОрганизаций.ВидЕжегодногоОтпуска,
   |    ФактическиеОтпускаОрганизаций.Количество,
   |    ФактическиеОтпускаОрганизаций.ДатаРегистрации КАК ДатаРегистрации,
   |    ФактическиеОтпускаОрганизаций.Регистратор КАК Регистратор,
   |    ФактическиеОтпускаОрганизаций.НомерСтроки КАК НомерСтрокиРегистра
   |ИЗ
   |    РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпускаОрганизаций
   |ГДЕ
   |    ФактическиеОтпускаОрганизаций.Сотрудник = &Сотрудник
   |    " + ?(Регистратор = Неопределено, "", "И (НЕ ФактическиеОтпускаОрганизаций.Регистратор В (&МассивДокументов))") + "
   |    И (НЕ ФактическиеОтпускаОрганизаций.Компенсация)
   |
   |УПОРЯДОЧИТЬ ПО
   |    ДатаРегистрации,
   |    Регистратор,
   |    НомерСтрокиРегистра";
   Выборка = Запрос.Выполнить().Выбрать();
   
   ТаблицаПериодов = Новый ТаблицаЗначений;
   ТаблицаПериодов.Колонки.Добавить("НомерСтроки",                Новый ОписаниеТипов("Число"));
   ТаблицаПериодов.Колонки.Добавить("Сотрудник",                Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций"));
   ТаблицаПериодов.Колонки.Добавить("ВидЕжегодногоОтпуска",    Новый ОписаниеТипов("СправочникСсылка.ВидыЕжегодныхОтпусков"));
   ТаблицаПериодов.Колонки.Добавить("ДатаНачала",                Новый ОписаниеТипов("Дата"));
   ТаблицаПериодов.Колонки.Добавить("ДатаОкончания",            Новый ОписаниеТипов("Дата"));
   ТаблицаПериодов.Колонки.Добавить("Количество",                Новый ОписаниеТипов("Число"));
   ТаблицаПериодов.Колонки.Добавить("ДатаРегистрации",            Новый ОписаниеТипов("Дата"));
   Если ДатаУвольнения <> Неопределено Тогда
       ТаблицаПериодов.Колонки.Добавить("ДатаРасчетаПриУвольнении",    Новый ОписаниеТипов("Дата"));
   КонецЕсли;
   
   ТаблицаСторноОтпусков = Новый ТаблицаЗначений;
   ТаблицаСторноОтпусков.Колонки.Добавить("НомерСтроки",            Новый ОписаниеТипов("Число"));
   ТаблицаСторноОтпусков.Колонки.Добавить("Сотрудник",                Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций"));
   ТаблицаСторноОтпусков.Колонки.Добавить("ВидЕжегодногоОтпуска",    Новый ОписаниеТипов("СправочникСсылка.ВидыЕжегодныхОтпусков"));
   ТаблицаСторноОтпусков.Колонки.Добавить("ДатаНачала",            Новый ОписаниеТипов("Дата"));
   ТаблицаСторноОтпусков.Колонки.Добавить("ДатаОкончания",            Новый ОписаниеТипов("Дата"));
   ТаблицаСторноОтпусков.Колонки.Добавить("Количество",            Новый ОписаниеТипов("Число"));
   ТаблицаСторноОтпусков.Колонки.Добавить("ДатаРегистрации",        Новый ОписаниеТипов("Дата"));
   
   НомерСтроки = 1;
   Пока Выборка.Следующий() Цикл
       Если Выборка.Количество > 0 Тогда
           Строка = ТаблицаПериодов.Добавить();
           Если ДатаУвольнения <> Неопределено Тогда
               Строка.ДатаРасчетаПриУвольнении    = ДатаУвольнения;
           КонецЕсли;
       Иначе
           Строка = ТаблицаСторноОтпусков.Добавить();
       КонецЕсли;
       ЗаполнитьЗначенияСвойств(Строка, Выборка);
       Строка.НомерСтроки = НомерСтроки;
       НомерСтроки = НомерСтроки + 1;
   КонецЦикла;
   
   // Выборка по видам отпусков
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ВидыЕжегодныхОтпусков.Ссылка,
   |    ВидыЕжегодныхОтпусков.Код КАК Код
   |ИЗ
   |    Справочник.ВидыЕжегодныхОтпусков КАК ВидыЕжегодныхОтпусков
   |ГДЕ
   |    (НЕ ВидыЕжегодныхОтпусков.ПометкаУдаления)
   |
   |УПОРЯДОЧИТЬ ПО
   |    Код";
   ВыборкаПоВидамОтпусков = Запрос.Выполнить().Выбрать();
   
   // Получим остатки отпуска на следующий день после текущего или после даты увольнения,
   // Чтобы отпуска текущего дня тоже попали в отчет
   Пока ВыборкаПоВидамОтпусков.Следующий() Цикл
       Строка = ТаблицаПериодов.Добавить();
       Строка.НомерСтроки                    = 0;
       Строка.ВидЕжегодногоОтпуска            = ВыборкаПоВидамОтпусков.Ссылка;
       Строка.Сотрудник                    = Сотрудник;
       Строка.ДатаНачала                    = ДатаАктуальности + ДлинаСуток;
       Строка.ДатаОкончания                = ДатаАктуальности + ДлинаСуток;
       Если ДатаУвольнения <> Неопределено Тогда
           Строка.ДатаРасчетаПриУвольнении    = ДатаУвольнения;
       КонецЕсли;
   КонецЦикла;
   
   // Получим остатки на конец каждого рабочего года, если сотрудник принят на работу
   Если ЗначениеЗаполнено(ДатаПриема) Тогда
       ТаблицаРабочихЛет = Новый ТаблицаЗначений;
       ТаблицаРабочихЛет.Колонки.Добавить("ДатаНачала");
       ТаблицаРабочихЛет.Колонки.Добавить("ДатаОкончания");
       
       ДатаНачалаРабочегоГода        = ДатаПриема;
       ДатаОкончанияРабочегоГода    = ДобавитьМесяц(ДатаПриема, 12) - 1;
       
       Пока ДатаОкончанияРабочегоГода < ДобавитьМесяц(ДатаАктуальности, 12) Цикл
           Строка = ТаблицаРабочихЛет.Добавить();
           Строка.ДатаНачала        = ДатаНачалаРабочегоГода;
           Строка.ДатаОкончания    = ДатаОкончанияРабочегоГода;
           
           Если Строка.ДатаОкончания < Дата(2006, 10, 6) Тогда
               КоличествоДнейВключаемых = 7;
           Иначе
               КоличествоДнейВключаемых = 14;
           КонецЕсли;
           
           Для Каждого ОтпускДляИсключения Из ТаблицаИсключаемыхОтпусков Цикл
               Если Строка.ДатаНачала <= ОтпускДляИсключения.ДатаНачалаПродления
                   И ОтпускДляИсключения.ДатаНачалаПродления <= Строка.ДатаОкончания Тогда
                   
                   Если ОтпускДляИсключения.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускБезСохраненияЗарплаты Тогда
                       КоличествоДнейОтпуска    = ОтпускДляИсключения.КоличествоДнейОтпуска;
                       
                       ОтпускДляИсключения.ДатаНачалаПродления        = ОтпускДляИсключения.ДатаНачалаПродления + Мин(ОтпускДляИсключения.КоличествоДнейПродления, КоличествоДнейВключаемых) * ДлинаСуток;
                       ОтпускДляИсключения.КоличествоДнейПродления    = Макс(ОтпускДляИсключения.КоличествоДнейПродления - КоличествоДнейВключаемых, 0);
                       
                       Если ОтпускДляИсключения.КоличествоДнейПродления > 0 Тогда
                           Строка.ДатаОкончания        = Строка.ДатаОкончания + ОтпускДляИсключения.КоличествоДнейПродления * ДлинаСуток;
                       КонецЕсли;
                       
                       КоличествоДнейВключаемых = Макс(КоличествоДнейВключаемых - КоличествоДнейОтпуска, 0);
                       
                   Иначе
                       Строка.ДатаОкончания = Строка.ДатаОкончания + ОтпускДляИсключения.КоличествоДнейПродления * ДлинаСуток;
                       
                   КонецЕсли;
               КонецЕсли;
           КонецЦикла;
           
           ДатаНачалаРабочегоГода        = Строка.ДатаОкончания + 1;
           ДатаОкончанияРабочегоГода    = ДобавитьМесяц(ДатаНачалаРабочегоГода, 12) - 1;
       КонецЦикла;
       
       НомерСтроки = -1;
       Для Каждого РабочийГод Из ТаблицаРабочихЛет Цикл
           Если РабочийГод.ДатаОкончания > ДатаАктуальности Тогда
               Прервать;
           КонецЕсли;
           
           ВыборкаПоВидамОтпусков.Сбросить();
           Пока ВыборкаПоВидамОтпусков.Следующий() Цикл
               Строка = ТаблицаПериодов.Добавить();
               Строка.НомерСтроки            = НомерСтроки;
               Строка.ВидЕжегодногоОтпуска    = ВыборкаПоВидамОтпусков.Ссылка;
               Строка.Сотрудник            = Сотрудник;
               Строка.ДатаНачала            = РабочийГод.ДатаОкончания;
               Строка.ДатаОкончания        = РабочийГод.ДатаОкончания;
           КонецЦикла;
           НомерСтроки = НомерСтроки - 1;
       КонецЦикла;
   КонецЕсли;
   
   Выборка = ПроцедурыУправленияПерсоналом.ПодготовитьДанныеПоРегламентированнымОтпускам(ТаблицаПериодов, Регистратор);
   
   // таблица с макетами
   ТаблицаМакетовЗаПериод    = Новый ТаблицаЗначений;
   ТаблицаМакетовЗаПериод.Колонки.Добавить("Период");
   ТаблицаМакетовЗаПериод.Колонки.Добавить("НомерСтроки");
   ТаблицаМакетовЗаПериод.Колонки.Добавить("ПорядокГруппы");
   ТаблицаМакетовЗаПериод.Колонки.Добавить("МассивМакетов");
   
   ОкруглятьДниОтпускаПриКомпенсации = Константы.ОкруглятьДниОтпускаПриКомпенсации.Получить();
   
   Пока Выборка.Следующий() Цикл
       Если Выборка.НомерСтроки = 0 Тогда // Остаток отпуска на рабочую дату/дату увольнения
           МассивМакетов = Новый Массив;
           
           ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
           Если ДатаУвольнения = Неопределено Тогда
               Если СотрудникУволен Тогда
                   ОбластьМакета.Параметры.Период        = "На дату увольнения, " + Формат(ДатаАктуальности, ФорматДаты);
               Иначе
                   ОбластьМакета.Параметры.Период        = "На сегодня, " + Формат(ДатаАктуальности, ФорматДаты);
               КонецЕсли;
           Иначе
               ОбластьМакета.Параметры.Период            = "На " + Формат(ДатаАктуальности, ФорматДаты);
           КонецЕсли;
           МассивМакетов.Добавить(ОбластьМакета);
           
           Если СотрудникУволен И Не ОкруглятьДниОтпускаПриКомпенсации Тогда
               ОстатокОтпуска = Выборка.Количество;
               
           Иначе
               Если Выборка.Количество < 0 Тогда
                   ОстатокОтпуска = Цел(Выборка.Количество);
               Иначе
                   ОстатокОтпуска = Цел(Выборка.Количество) + ?(Цел(Выборка.Количество) = Выборка.Количество, 0, 1);
               КонецЕсли;
               
           КонецЕсли;
           
           Если ОстатокОтпуска >= 0 Тогда
               ОбластьМакета = Макет.ПолучитьОбласть("Строка");
               ОбластьМакета.Параметры.Текст            = "Неиспользованный отпуск";
               ОбластьМакета.Параметры.КоличествоДней    = "" + ОстатокОтпуска + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ОстатокОтпуска);
           Иначе
               ОбластьМакета = Макет.ПолучитьОбласть("ВажнаяСтрока");
               ОбластьМакета.Параметры.Текст            = "Использовано за счет отпусков будущего периода";
               ОбластьМакета.Параметры.КоличествоДней    = "" + (-ОстатокОтпуска) + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ОстатокОтпуска);
           КонецЕсли;
           МассивМакетов.Добавить(ОбластьМакета);
           
           ВыборкаПоВидуОтпуска = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
           Пока ВыборкаПоВидуОтпуска.Следующий() Цикл
               Если ОстатокОтпуска >= 0 Тогда
                   ОбластьМакета = Макет.ПолучитьОбласть("Строка");
                   ОбластьМакета.Параметры.Текст            = "     " + ВыборкаПоВидуОтпуска.ВидЕжегодногоОтпуска;
                   ОбластьМакета.Параметры.КоличествоДней    = "" + ВыборкаПоВидуОтпуска.Количество + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ВыборкаПоВидуОтпуска.Количество);
                   МассивМакетов.Добавить(ОбластьМакета);
               КонецЕсли;
               Если ОстатокОтпуска < 0 И ВыборкаПоВидуОтпуска.Количество < 0 Тогда
                   ОбластьМакета = Макет.ПолучитьОбласть("ВажнаяСтрока");
                   ОбластьМакета.Параметры.Текст            = "     " + ВыборкаПоВидуОтпуска.ВидЕжегодногоОтпуска;
                   ОбластьМакета.Параметры.КоличествоДней    = "" + (-ВыборкаПоВидуОтпуска.Количество) + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ВыборкаПоВидуОтпуска.Количество);
                   МассивМакетов.Добавить(ОбластьМакета);
               КонецЕсли;
           КонецЦикла;
           
           Строка = ТаблицаМакетовЗаПериод.Добавить();
           Строка.НомерСтроки        = Выборка.НомерСтроки;
           Строка.Период            = КонецДня(ДатаАктуальности);
           Строка.ПорядокГруппы    = 100;
           Строка.МассивМакетов    = МассивМакетов;
           
       ИначеЕсли Выборка.НомерСтроки < 0 Тогда // Закончился рабочий год
           МассивМакетов = Новый Массив;
           
           ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
           ОбластьМакета.Параметры.Комментарий        = "Закончился рабочий год";
           ОбластьМакета.Параметры.Период            = Формат(Выборка.МаксимальнаяДатаНачалаРабочегоГода, ФорматДаты) + " - " + Формат(Выборка.ДатаОкончанияРабочегоГода, ФорматДаты);
           МассивМакетов.Добавить(ОбластьМакета);
           
           Если Выборка.Количество < 0 Тогда
               ОстатокОтпуска = Цел(Выборка.Количество);
           Иначе
               ОстатокОтпуска = Цел(Выборка.Количество) + ?(Цел(Выборка.Количество) = Выборка.Количество, 0, 1);
           КонецЕсли;
           
           Если ОстатокОтпуска >= 0 Тогда
               ОбластьМакета = Макет.ПолучитьОбласть("Строка");
               ОбластьМакета.Параметры.Текст            = "Неиспользованный отпуск";
               ОбластьМакета.Параметры.КоличествоДней    = "" + ОстатокОтпуска + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ОстатокОтпуска);
           Иначе
               ОбластьМакета = Макет.ПолучитьОбласть("ВажнаяСтрока");
               ОбластьМакета.Параметры.Текст            = "Использовано за счет отпусков будущего периода";
               ОбластьМакета.Параметры.КоличествоДней    = "" + (-ОстатокОтпуска) + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ОстатокОтпуска);
           КонецЕсли;
           МассивМакетов.Добавить(ОбластьМакета);
           
           ВыборкаПоВидуОтпуска = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
           Пока ВыборкаПоВидуОтпуска.Следующий() Цикл
               Если ОстатокОтпуска >= 0 Тогда
                   ОбластьМакета = Макет.ПолучитьОбласть("Строка");
                   ОбластьМакета.Параметры.Текст            = "     " + ВыборкаПоВидуОтпуска.ВидЕжегодногоОтпуска;
                   ОбластьМакета.Параметры.КоличествоДней    = "" + ВыборкаПоВидуОтпуска.Количество + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ВыборкаПоВидуОтпуска.Количество);
                   МассивМакетов.Добавить(ОбластьМакета);
               КонецЕсли;
               Если ОстатокОтпуска < 0 И ВыборкаПоВидуОтпуска.Количество < 0 Тогда
                   ОбластьМакета = Макет.ПолучитьОбласть("ВажнаяСтрока");
                   ОбластьМакета.Параметры.Текст       &n
23 IBTM
 
20.10.11
00:33
Добавлю одну концовку:
   

Для Каждого СтрокаТаблицы Из ТаблицаМакетовЗаПериод Цикл
       Для Каждого ОбластьМакета Из СтрокаТаблицы.МассивМакетов Цикл
           ТабДокумент.Вывести(ОбластьМакета);
       КонецЦикла;
   КонецЦикла;
   
   ФИОСотрудника = СокрЛП(Сотрудник);
   УниверсальныеМеханизмы.Просклонять(КомпонентаСклоненияФИО, ФИОСотрудника, 2, , ФИОСотрудника);
   
   УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, , , "Отпуска " + ФИОСотрудника);
   
   ТабДокумент.Записать("C:\My Documents\Таблица2.xls");
24 kotletka
 
20.10.11
00:39
нужно добавить
ТипФайлаТабличногоДокумента.XLS
25 kotletka
 
20.10.11
00:40
а весь то код нах выложил, хорошо что не 7.7 а то гм бы ещё выложил
26 kotletka
 
20.10.11
00:41
ТабДокумент.Записать("C:\My Documents\Таблица2.xls",ТипФайлаТабличногоДокумента.XLS)
27 IBTM
 
20.10.11
00:48
(26) Благодарю тебя!

да, с кодом я погоречился, виноват!
28 IBTM
 
20.10.11
00:51
интересно почему в помошнике где ТабДок про это перечисление ни чего не сказанно?!
29 IBTM
 
20.10.11
00:53
в (28) херню написал, всё там есть. Пример там меня с понталыги збил.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс