Компания ВипСофт

Услуги программистов 1С в Москве . Конфигурирование информационных систем.

+7(967)084-32-14

1С и Excel. таблица функций Excel доступных из 1С

Многие знают, что Excel гораздо старше 1С. На мой взгляд, это очень успешный продукт, и нареканий о нем я не слышал. Excel прост и универсален. Он способен выполнять не только простые арифметические операции, но и сложные вычисления, построение графиков и т.п. Знаю примеры, когда организации до перехода на 1С вели часть бухгалтерии в Excel. Многие и сейчас параллельно используют две программы. В этой статье рассмотрим способы обмена данными между 1С и Excel.

Таблицы 1С и Excel.

Многие пользователи для удобства работы сохраняют таблицы 1С (печатные формы) в формате Excel (*.xls). После чего в полученном файле делают различные группировки, сортировки, вычисления и т.п. Связано это с тем, что в таблицах 1С нет такого огромного функционала как в таблицах Excel. Но в версии 1С 8.0 есть нововведения, делающих работу с таблицами более комфортной.

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

Получение данных из Excel.

Доступ из 1С к Excel производится посредством OLE. Например, код

Попытка
Эксель= СоздатьОбъект("Excel.Application");
Исключение

Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
Возврат;

КонецПопытки;

позволит нам получить доступ через переменную "Эксель" к запущенному приложению Excel. А далее уже можно получить доступ к книге (файлу), листу и ячейке с данными. Далее примеры кода.

Открытие книги (файла):

Книга=Эксель.WorkBooks.Open(ПутьКФайлу);

ПутьКФайлу - полный путь к файлу книги Excel.

Выбор листа книги для работы с ним:

Лист=Книга.WorkSheets(НомерЛиста);

или

Лист=Книга.WorkSheets(ИмяЛиста);

НомерЛиста - номер листа в книге, ИмяЛиста - имя листа в книге.

Получение значения ячейки листа:

Значение=Лист.Cells(НомерСтроки,НомерКолонки).Value;

НомерСтроки, НомерКолонки - номер строки и номер колонки, на пересечении которых находится ячейка.

Важно: не забывайте поле выполнения нужных действий добавлять кодЭксель.Quit();, иначе запущенный процесс останется незавершенным и будет занимать память и процессор компьютера.

Вывод данных в Excel.

Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо

создать новую, и выбрать рабочий лист для вывода данных. Открытие существующей книги описано выше, а для создания новой книги нужно использовать следующий код:

Попытка
Эксель= СоздатьОбъект("Excel.Application");
Исключение

Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
Возврат;

КонецПопытки;
Книга=Эксель.WorkBooks.Add();

Так как при создании книги в Excel автоматически создаются листы (Сервис->Параметры->Общие->Листов в новой книге), то нужно лишь произвести выбор листа, с которым будет вестись работа:

Лист=Книга.WorkSheets(НомерЛиста);

либо добавить в книгу новый лист, если необходимо:
Лист=Книга.Sheets.Add();

Следующим шагом будет установка значения ячейки:
Лист.Cells(НомерСтроки,НомерКолонки).Value=Значение;

НомерСтроки, НомерКолонки - номер строки и номер колонки, на пересечении которых находится ячейка.

И в конце нужно произвести запись созданной книги:

Попытка
Книга.SaveAs(ПутьКФайлу);
Исключение

Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
Возврат;

КонецПопытки;

ПутьКФайлу - полный путь к файлу книги Excel (включая имя).

Важно: не забывайте, что в имени файлов не должно содержаться символов \ / : * ? " > < |.

Часто используемые методы для чтения/установки значений в Excel.

Эксель = СоздатьОбъект("Excel.Application");

Получение доступа к приложению Excel.

Эксель.Visible = Видимость;

0 - Excel не виден, 1 - виден.

Книга = Эксель.WorkBooks.Add();

Создание новой книги (файла) Excel.

Книга.SaveAs(ИмяФайла);

Сохранение книги Excel.

Лист = Книга.WorkSheets.Add();

Добавление нового листа в книгу.

Книга = Эксель.WorkBooks.Open(ИмяФайла);

Открытие существующей книги (файла) Excel.

Лист = Книга.WorkSheets(НомерЛиста);

Установка листа в качестве рабочего с номером НомерЛиста.

Лист.Name = ИмяЛиста;

Задание рабочему листу имени ИмяЛиста

Лист.PageSetup.Zoom = Масштаб;

Задание параметра страницы "Масштаб" (от 10 до 400).

Лист.PageSetup.Orientation = Ориентация;

Ориентация: 1 - книжная, 2 - альбомная.

Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры);

Задание левой границы (в сантиметрах).

Лист.PageSetup.TopMargin =

Эксель.CentimetersToPoints(Сантиметры);

Задание верхней границы (в сантиметрах).

Лист.PageSetup.RightMargin =

Эксель.CentimetersToPoints(Сантиметры);

Задание правой границы (в сантиметрах).

Лист.PageSetup.BottomMargin =

Эксель.CentimetersToPoints(Сантиметры);

Задание нижней границы (в сантиметрах).

Лист.Columns(НомерКолонки).ColumnWidth = Ширина;

Задание ширины колонке.

Лист.Cells(НомерСтроки,НомерКолонки).Value = Значение;

Ввод данных в ячейку.

Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта;

Установка шрифта в ячейке.

Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта;

Установка размера шрифта в ячейке.

Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный;

1 - жирный шрифт, 0 - нормальный.

Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив;

1 - наклонный шрифт, 0 - нормальный.

Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline =

Подчеркнутый;

2 - подчеркнутый, 1 - нет.

Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat =

Формат;

Установка формата данных ячейки.

Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle =

ТипЛинии;

Установка рамок ячейки. 1 - тонкая сплошная.

Постоянный адрес статьи http://exp-1c.narod.ru/articles/articl01.htm

Комментариев: 24

  1. 2008-10-15 в 21:25:35 | Дмитрий

    Огромное спасибо за таблицуwink Очень помоглоwink

  2. 2009-05-26 в 19:53:42 | Александр

    Кто-нибудь подскажите, почему в строке кода

    Лист.cells(сч,5).NumberFormat = "0.000";

    Возникает следующая ошибка:

    Ошибка при установке значения атрибута контекста (NumberFormat): Произошла исключительная ситуация (Microsoft Office Excel): Нельзя установить свойство NumberFormat класса Range

    Лист.cells(сч,5).NumberFormat = "0.000";

    по причине:Произошла исключительная ситуация (Microsoft Office Excel): Нельзя установить свойство NumberFormat класса Range

  3. 2009-06-04 в 00:07:26 | Юра

    (2) Исправь точку на запятую: "0,000"

  4. 2009-06-24 в 17:51:49 | Антон

    2009-06-03 в 21:07:26 | Юра (анонимно)

    (2) Исправь точку на запятую: "0,000"

    Спасибо, очень помогло!

  5. 2009-07-24 в 11:19:38 | sf

    скажите пжста как в цвет шрифта установить и цвет фона ячейки !?

    везде ищу нигде нет...

  6. 2009-07-28 в 20:19:21 | Аноним

    //скажите пжста как в цвет шрифта установить и цвет фона ячейки !?

    //везде ищу нигде нет...

    Interior.ColorIndex (1 - 56)

    НашЛист.Cells(1,1).Interior.ColorIndex = 35;

  7. 2009-09-04 в 14:57:09 | Resear4er

    Спасибо за статью! Она оказалась очень полезной.

    Вот только не нашел здесь ответ на один очень важный для меня вопрос. Как в excel вставить формулы, чтобы они работали? Теми способами которыми я пробовал, они воспринимались как значения строкового типа и соответственно не работали.

  8. 2009-10-30 в 14:36:26 | Cara

    Ошибка при установке значения атрибута контекста (Orientation): Произошла исключительная ситуация (Microsoft Office Excel): Нельзя установить свойство Orientation класса PageSetup

    ЛистExcel.PageSetup.Orientation = 1;

  9. 2010-02-26 в 03:37:03 | Grom

    Ячейка.Value=Номер.АбонНомер;

    {Документ.Отчеты.Модуль Документа(15)}: Плохой тип переменной

  10. 2010-04-02 в 16:12:50 | Евгений

    Ситуация. Нужна выгрузка в Excel из 1С:, причем структура (состав и формат ячеек) файла Excel заранее известна.

    Возможно ли формирование новых строк файла Excel копированием пустой строки (с заранее определенным форматом и атрибутами всех ячеек) с последующим заполнением этой новой строки значениями данными из "1С:"? Спасибо.

  11. 2010-05-09 в 15:10:09 | Комментатор 4

    Всем Привет!

    Не подскажет кто, как программно из 1С

    удалить лист в Excel версии выше 97?

    В 97 проходит:

    q.Worksheets(i).Delete();

    (

    где i - номер страницы для удаления, q - книга Excel:

    Эксель=СоздатьОбъект("Excel.Application");

    q=Эксель.WorkBooks.Add();

    )

  12. 2010-08-08 в 18:49:46 | dimasss

    Как после всех операци с Excel выгрузить его из памяти попросту закрыть. А то если видемость ставим 0 то все только через диспечера можно закрыть.

  13. 2010-09-06 в 08:40:26 | Maxim

    Подскажите пожалуйста, как из 1С закрыть только рабочую книгу в экселе, если открыто несколько книг? Потому что при закрытии закрываются все книги сразу (рабочая и все остальные которые открыты)

  14. 2010-11-19 в 12:40:15 | Комментатор 6

    Подскажите пожалуйста как вставить примечание.

  15. 2010-11-25 в 18:08:16 | Комментатор 7

    Здравствуйте. Поделитесь подобной таблицей для работы с Word.Application

    Спасибо.

  16. 2011-04-20 в 20:24:50 | Protey

    Для MS Word:

    Ну, табличку составлять у мя времени нет, а вот кодом поделюсь.

    Процедура Сформировать()

    //Попытка запуска приложения

    Попытка

    Application=СоздатьОбъект("Word.Application");

    Исключение

    Сообщить(ОписаниеОшибки(),"!!!");

    Сообщить("Возможно, MS Word не установлен на этом компьютере.");

    Возврат;

    КонецПопытки;

    // , , DocumentType:=0

    //Создание листа документа

    Application.Documents.Add();

    WorkBook=Application.ActiveDocument;

    //Получение окна

    Window=WorkBook.Windows(1);

    //Установка невидимости окна для убыстрения вывода

    Window.Visible=1;

    //не выдавать предупреждений

    Application.DisplayAlerts=0;

    //Установка ориентации листа

    WorkBook.PageSetup.Orientation = 0;

    //Это портретная, альбомная 1

    //Установка размера полей

    WorkBook.PageSetup.TopMargin = 28; //Размер в поинтах, 1 СМ=28pt

    WorkBook.PageSetup.BottomMargin = 28;

    WorkBook.PageSetup.LeftMargin = 28;

    WorkBook.PageSetup.RightMargin = 28;

    //Установка высоты колонтитулов

    WorkBook.PageSetup.HeaderDistance = 28; //Размер в поинтах, 1 СМ=28pt

    WorkBook.PageSetup.FooterDistance = 28;

    //Установка зеркальных полей

    WorkBook.PageSetup.MirrorMargins = False;

    //Установка параметров абзаца

    Application.Selection.ParagraphFormat.LeftIndent = 10;//Абзац, отступ слева

    Application.Selection.ParagraphFormat.RightIndent = 10;//Абзац, отступ Справа

    Application.Selection.ParagraphFormat.SpaceBefore = 10;//Отступ до абзаца

    Application.Selection.ParagraphFormat.SpaceBeforeAuto = False; //не автомат

    Application.Selection.ParagraphFormat.SpaceAfter = 10;//Отступ после абзаца

    Application.Selection.ParagraphFormat.SpaceAfterAuto = False;//не автомат

    Application.Selection.ParagraphFormat.LineSpacingRule = 1;//Междустрочный интервал 0-одинарный,1-полуторный,2-двойной

    Application.Selection.ParagraphFormat.FirstLineIndent = 28;//Отступ первой строки абзаца

    Application.Selection.ParagraphFormat.Alignment = 3;//Выравнивание 0-по левому краю, 1-по центру, 2-по правому краю, 3-по ширине

    //Установка шрифта для печати

    Application.Selection.Font.Name = "Times New Roman";

    Application.Selection.Font.Size = 14;

    //Ввод текста

    Application.Selection.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");

    Application.Selection.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");

    Application.Selection.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");

    //Ввод абзаца

    Application.Selection.TypeParagraph();

    //Ввод текста

    Application.Selection.Font.Name = "Courier New";

    Application.Selection.Font.Size = 14;

    Application.Selection.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");

    Application.Selection.Font.Bold = 1;

    Application.Selection.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");

    Application.Selection.Font.Bold = 0;

    Application.Selection.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");

    Application.Selection.TypeParagraph();

    //Запись и форматирование верхнего колонтитула

    WorkBook.Sections(1).Headers(1).Range.ParagraphFormat.Alignment = 2;

    WorkBook.Sections(1).Headers(1).Range.Font.Name = "Times New Roman";

    WorkBook.Sections(1).Headers(1).Range.Font.Bold = 1;

    WorkBook.Sections(1).Headers(1).Range.Font.Size = 8;

    WorkBook.Sections(1).Headers(1).Range.Font.Size = 8;

    WorkBook.Sections(1).Headers(1).Range.Text="Верхний колонтитул";

    //Запись и форматирование нижнего колонтитула

    WorkBook.Sections(1).Footers(1).Range.ParagraphFormat.Alignment = 0;

    WorkBook.Sections(1).Footers(1).Range.Font.Name = "Times New Roman";

    WorkBook.Sections(1).Footers(1).Range.Font.Italic = 1;

    WorkBook.Sections(1).Footers(1).Range.Font.Size = 8;

    WorkBook.Sections(1).Footers(1).Range.Font.Size = 8;

    WorkBook.Sections(1).Footers(1).Range.Text="Нижний колонтитул";

    //Вставка и форматирование таблицы

    WorkBook.Tables.Add(WorkBook.Paragraphs(Workbook.Paragraphs.Count()).Range,3,2);

    WorkBook.Tables(1).Range.Select();

    Application.Selection().Style = "Сетка таблицы";

    Application.Selection.Tables(1).Columns(1).Width = 97.55;

    Application.Selection.Tables(1).Columns(2).Width = 446.5;

    Application.Selection.ParagraphFormat.LeftIndent = 0;//Абзац, отступ слева

    Application.Selection.ParagraphFormat.RightIndent = 0;//Абзац, отступ Справа

    Application.Selection.ParagraphFormat.SpaceBefore = 3;//Отступ до абзаца

    Application.Selection.ParagraphFormat.SpaceBeforeAuto = False; //не автомат

    Application.Selection.ParagraphFormat.SpaceAfter = 0;//Отступ после абзаца

    Application.Selection.ParagraphFormat.SpaceAfterAuto = False;//не автомат

    Application.Selection.ParagraphFormat.LineSpacingRule = 0;//Междустрочный интервал 0-одинарный,1-полуторный,2-двойной

    Application.Selection.ParagraphFormat.FirstLineIndent = 0;//Отступ первой строки абзаца

    Application.Selection.ParagraphFormat.Alignment = 1;//Выравнивание 0-по левому краю, 1-по центру, 2-по правому краю, 3-по ширине

    //Заполнения таблицы

    WorkBook.Tables(1).Cell(1,1).Range.Font.Name = "Times New Roman";

    WorkBook.Tables(1).Cell(1,1).Range.Font.Size = 8;

    WorkBook.Tables(1).Cell(1,1).Range.Font.Bold = 1;

    WorkBook.Tables(1).Cell(1,1).Range.Text = "Это первая строка, первая колонка";

    WorkBook.Tables(1).Cell(1,1).Range.Font.Name = "Times New Roman";

    WorkBook.Tables(1).Cell(1,1).Range.Font.Size = 8;

    //Форматирование ячейки таблицы

    WorkBook.Tables(1).Cell(1,2).Range.Font.Name = "Times New Roman";

    WorkBook.Tables(1).Cell(1,2).Range.Font.Size = 8;

    WorkBook.Tables(1).Cell(1,2).Range.Font.Bold = 1;

    //Вставка таблицы в ячейку

    WorkBook.Tables(1).Cell(1,2).Range.Select();

    Application.Selection.TypeParagraph();

    //Application.Selection.TypeParagraph();

    //Application.Selection.TypeParagraph();

    //Application.Selection.TypeParagraph();

    WorkBook.Tables(1).Cell(1,2).Range.Select();

    Application.Options.DefaultBorderLineStyle=2;

    qwer=Application.ActiveDocument.Tables.Add(Application.Selection().Range,3,9,9);

    qwer.Range.Select();

    Application.Selection().Borders.InsideLineStyle=2;

    //WorkBook.Tables(2).Cell(1,1).Range.Font.Name = "Times New Roman";

    //WorkBook.Tables(2).Cell(1,1).Range.Font.Size = 8;

    //WorkBook.Tables(2).Cell(1,1).Range.Font.Bold = 1;

    //WorkBook.Tables(2).Cell(1,1).Range.Text = "Это полная херня";

    //Application.Selection.MoveDown(7,7);

    ////***************************************

    //Application.Selection.TypeParagraph();

    //

    //WorkBook.Tables.Add(WorkBook.Paragraphs(Workbook.Paragraphs.Count()).Range,3,2);

    //WorkBook.Tables(2).Range.Select();

    //Application.Options.DefaultBorderLineStyle=2;

    //Application.Selection().Borders.InsideLineStyle=2;

    ////Application.Selection().Style = "Сетка таблицы";

    //

    //Application.Selection.Tables(1).Columns(1).Width = 97.55;

    //Application.Selection.Tables(1).Columns(2).Width = 446.5;

    ////

    //Application.Selection.ParagraphFormat.LeftIndent = 0;//Абзац, отступ слева

    //Application.Selection.ParagraphFormat.RightIndent = 0;//Абзац, отступ Справа

    //Application.Selection.ParagraphFormat.SpaceBefore = 3;//Отступ до абзаца

    //Application.Selection.ParagraphFormat.SpaceBeforeAuto = False; //не автомат

    //Application.Selection.ParagraphFormat.SpaceAfter = 0;//Отступ после абзаца

    //Application.Selection.ParagraphFormat.SpaceAfterAuto = False;//не автомат

    //Application.Selection.ParagraphFormat.LineSpacingRule = 0;//Междустрочный интервал 0-одинарный,1-полуторный,2-двойной

    //Application.Selection.ParagraphFormat.FirstLineIndent = 0;//Отступ первой строки абзаца

    //Application.Selection.ParagraphFormat.Alignment = 1;//Выравнивание 0-по левому краю, 1-по центру, 2-по правому краю, 3-по ширине

    //

    //////Заполнения таблицы

    //WorkBook.Tables(2).Cell(1,2).Range.Font.Name = "Times New Roman";

    //WorkBook.Tables(2).Cell(1,2).Range.Font.Size = 8;

    //WorkBook.Tables(2).Cell(1,2).Range.Font.Italic = 1;

    //WorkBook.Tables(2).Cell(1,2).Range.Text = "Это первая строка, вторая колонка";

    Application.Visible=1;

    Window.Visible=1;

    КонецПроцедуры

  17. 2011-10-20 в 09:13:15 | Алексей

    Доброго времени суток! Подскажите, пожалуйста, как удалить текст из таблицы в документе MS WORD.

    Предистория: Нужно из 1С выводить в документ Word текст письма, который храниться в комментарии. Я создал шаблон Word, такого вида:

    //колонтитул

    текст

    абзац1

    ...

    абзац15

    подпись

    //Колонтитул

    абзацы и подпись находятся в таблице. все заполняется, все хорошо, но письма разные бывают (большие и маленькие). Если письмо большое - все нормально, если письмо короткое, то часть абзацев приходится менять на пустой символ ("") и тогда между текстом и письмом появляется большой пробел, приходится открывать документ и удалять лишние строки. Хотелось бы выяснить как убрать пустые строки из ячейки таблицы. Заранее благодарен.

  18. 2011-10-20 в 09:39:26 | Алексей

    Сам проблему и решил.

    Если кому-то будет полезно:

    ActiveDocument.Tables(НомерТаблицы).Cell(НомерСтроки,НомерСтолбца).Range.Text =

    СокрП(Сред(ActiveDocument.Tables(НомерТаблицы).Cell(НомерСтроки,НомерСтолбца).Range.Text, 1 , СтрДлина(ActiveDocument.Tables(НомерТаблицы).Cell(НомерСтроки,НомерСтолбца).Range.Text)-1));

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

  19. 2011-10-28 в 21:45:11 | писарь

    Sheet.Columns("D:D").Select();

    R = Sheet.Columns("D:D");

    R.NumberFormat = "0.00";

    при выполнении выдает

    {Отчет.Salary.Форма.Модуль(275)}: Microsoft Office Excel: Нельзя установить свойство NumberFormat класса Range, не могу понять в чем дело, по Вашим рекомендациям Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; работает, а как задать формат, "## #0.00" я тоже пробовал

  20. 2011-11-06 в 19:53:00 | андрей

    Установлен Офис - для некомм. использования.

    Может поэтому не открываться Эксель ?

    "Неудачная попытка создания объекта (Excel.Application)".

    Если можно, продублируйте на майл : a904@ya.ru. На сайте не бываю.

  21. 2011-11-10 в 14:46:29 | софи

    Здравствуйте!!!Помогите пожалуйста- я начала работу в 1с с нуля (скачала с интер) вела наименов товара, цену и кол-во в номенклатуре, как мне посмотреть остатки???

    заранее спасибо!!

  22. 2012-03-25 в 02:39:48 | Дмитрий

    Привет, а кто нибудь может подсказать, как раскрасить строки таблицы word?

  23. 2012-03-26 в 14:29:20 | Комментатор 11

    Добрый день, не подскажите, как можно обратиться к объекту типа рисунок,находящемуся на данном листе эксель? Нужно затем выделить и копировать объект..

  24. 2012-04-24 в 12:43:53 | liones

    Подскажите, как задать группировку строк.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)